我想知道在Android AsyncTask中调用super.onPostExecute(result)或super.onPreExecute是否有任何意义?我一直在调用它们,但即使在关于AsyncTask(Android API参考:AsyncTask)的Android文档中,它们也被省略了.如果我打电话给他们是否有意义呢?
在我的Android项目中,我有很多地方需要异步运行一些代码(Web请求,调用db等).这不是长时间运行的任务(最多几秒钟).到目前为止,我正在创建一个新线程,通过任务传递一个新的runnable.但是最近我读了一篇关于Java中的线程和并发的文章,并且理解为每个任务创建一个新的Thread并不是一个好的决定.
所以现在我ThreadPoolExecutor在我的Application类中创建了一个包含5个线程的类.这是代码:
public class App extends Application {
private ThreadPoolExecutor mPool;
@Override
public void onCreate() {
super.onCreate();
mPool = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一种方法可以将Runnable任务提交给执行者:
public void submitRunnableTask(Runnable task){
if(!mPool.isShutdown() && mPool.getActiveCount() != mPool.getMaximumPoolSize()){
mPool.submit(task);
} else {
new Thread(task).start();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我想在我的代码中运行异步任务时,我得到实例App并调用submitRunnableTask将runnable传递给它的方法.正如你所看到的,我也检查一下,如果线程池有自由线程来执行我的任务,如果没有,我创建一个新线程(我不认为这会发生,但无论如何......我不知道我希望我的任务在队列中等待并减慢应用程序).
在onTerminateApplication 的回调方法中,我关闭了池.
所以我的问题如下:这种模式比代码中创建新的线程更好吗?我的新方法有哪些优点和缺点?它会引起我不知道的问题吗?你能告诉我一些比这更好的东西来管理我的异步任务吗?
PS我在Android和Java方面有一些经验,但我远不是一个并发大师.所以可能有些方面我在这类问题中不太了解.任何建议将被认真考虑.
我在我的项目中使用本机库.我已经为ARM,ARMv7和x86架构构建它们,只是想知道我是否应该为MIPS构建它们?我在哪里可以找到有关Android设备的哪些部分在MIPS处理器上运行的任何统计信息.我想了解它是否有意义使我的APK在4 - 5 MB大,因为MIPS库.
我用Retrofit 2.0.0.这是构建我的HTTP客户端的代码
protected OkHttpClient getHttpClient(){
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(
chain -> {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder();
requestBuilder.header("Accept-Language", App.getInstance().getPrefs().getSelectedLanguage().toLowerCase());
requestBuilder.header("Accept-Encoding", "gzip");
if(API.this instanceof PrivateAPI){
LoginResponse loginResponse = AuthManager.getInstanse().getLoginResponse();
requestBuilder.header("Authorization", String.format("%s %s",
loginResponse.getTokenType(),
loginResponse.getAccessToken()));
}
requestBuilder.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
});
if(BuildConfig.DEBUG){
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
}
return builder.build();
}
Run Code Online (Sandbox Code Playgroud)
以下是我如何使用它来初始化我的Retrofit API接口:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(getGson()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(getHttpClient())
.build();
apiService = retrofit.create(PrivateAPIInterface.class);
Run Code Online (Sandbox Code Playgroud)
直到昨天我才得到完整的登录logcat,因为它应该是.但突然间,我开始在我的日志中找到空的响应主体.所以这是我现在获得的日志示例:
D/OkHttp: --> …Run Code Online (Sandbox Code Playgroud) 我使用Android示例项目ContactsList(http://developer.android.com/shareables/training/ContactsList.zip)作为示例在我的应用程序中开发联系人Activity.它在所有Android版本上都运行良好,但在Android 4.4中没有加载联系人图像,我收到以下错误:
NewFromFD failed in nativeDecodeFileDescriptor
Run Code Online (Sandbox Code Playgroud)
执行此方法时会发生这种情况:
BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
Run Code Online (Sandbox Code Playgroud)
它总是返回null.
要获取fileDescriptor本身,我使用此方法:
private Bitmap loadContactPhotoThumbnail(String photoData, int imageSize) {
if (!isAdded() || getActivity() == null) {
return null;
}
AssetFileDescriptor afd = null;
try {
Uri thumbUri;
if (Utils.hasHoneycomb()) {
thumbUri = Uri.parse(photoData);
Log.d("imageloader", photoData);
} else {
final Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_URI,photoData);
thumbUri = Uri.withAppendedPath(contactUri, Photo.CONTENT_DIRECTORY);
}
afd = getActivity().getContentResolver().openAssetFileDescriptor(thumbUri, "r");
Log.d("imageloader", afd.toString());
FileDescriptor fileDescriptor = null;
try{
fileDescriptor = afd.getFileDescriptor();
Log.d("imageloader", fileDescriptor.toString());
} catch …Run Code Online (Sandbox Code Playgroud) 我已经实现了 FCM,就像 if 的文档所说:
我有这样的服务
public class TCMessagingService extends FirebaseMessagingService
我已经在清单中声明了它,如下所示:
<service android:name=".services.TCMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
我使用 SDK 级别 25 进行定位和编译,我的 firebase 版本是 10.2.1。
现在的问题是,在 Android 8.0 上,有时我收到推送通知时会出现巨大的延迟。几分钟后就会出现。但情况并非总是如此,有时事情会像预期的那样进行,推送通知来得很快。
我尝试将 FCM 版本更新到最新版本,但这没有帮助。
但是,当我在设置中关闭应用程序的电池优化时,一切正常。但这不是解决方案。我该怎么做才能使 FCM 在 Android 8.0 上按预期工作?
我有一个使用 Kotlin 的多模块化 Gradle 项目。其中一个模块具有 main 方法以及对其他模块的依赖关系。我需要从这个模块创建一个可执行的 jar。所以我尝试通过创建这样的 Jar 任务来做到这一点
jar {
manifest {
attributes(
'Main-Class': 'my_package.RunnerKt'
)
}
from {
configurations.compileClasspath.filter{ it.exists() }.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试了Shadow Gradle 插件。在这两种情况下,胖罐子都是按预期创建的,它似乎拥有我所有的类和依赖项。但是当我运行 jar 时,java -jar出现以下错误:
java.lang.NoClassDefFoundError: Could not initialize class my_kotlin_object_classwhere my_kotlin_object_classis just a kotlin objectwith some variables.
在堆栈跟踪中,没有其他异常可能导致此异常,因此似乎只是此类本身存在问题。当我查看罐子时,我可以在那里看到这个文件。
我不明白这是 kotlin 对象本身和可执行 jar 的问题,还是我做错了什么?
我曾经RxJava + Retrofit在Android应用中进行API调用。在某些情况下,用户发出请求并且其令牌已过期。在这种情况下,我会在中收到正常响应onNext,但响应中不包含结果,而是包含一些代码的error元素。如果发生这种情况,我需要重新登录用户,并且仅在获得新令牌后才重复原始请求。所以我想用来组织这个RxJava。为了使事情变得容易,我将举一个简单的例子。假设我有以下方法:
public void test(int someInt){
Observable.just(someInt)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
log("onCompleted");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
log("onError");
}
@Override
public void onNext(Integer integer) {
log("onNext - " + integer);
}
});
Run Code Online (Sandbox Code Playgroud)
我想检查if (someInt == 0) 之前 onNext()被称为。如果我得到,false我想继续并被onNext()调用,但是如果我得到,true我想执行一些操作并仅重复一次原始可观察的,如果条件第二次返回false,我就不想再重复一次。
有人可以帮我弄清楚我对此有什么选择吗?PS我是RX世界的新手。
我有一个Android VOIP应用程序.由于一些网络阻止VOIP流量,我想找到一些方法绕过该块.我认为VPN可以做到这一点,但没有任何VPN解决方案可以轻松实现.使用Android提供的VPN API,您需要自己实现几乎所有内容(例如,那里没有任何协议实现).
那么还有其他方法可以实现我的需求吗?可能是SSH隧道或任何其他类型的隧道?
任何建议都会有所帮助,因为我不知道从哪里开始.
假设我有一个具有可为空属性的数据类:
data class User(
val fName: String?,
val lName: String?)
Run Code Online (Sandbox Code Playgroud)
在一个函数中,即使该实例不为空,我也会收到此类的实例,我想检查内部的至少一个属性是否已初始化且不为空。我知道我可以一一检查属性,但我想要一些更通用的东西,我用谷歌搜索了一下,似乎 Kotlin 没有这方面的扩展功能,所以我实现了一个,想与您分享并检查是否有人知道更好方法。
我的问题看起来很愚蠢......对我而言,这看起来真的很愚蠢.但是我很震惊地看到var关于android的视频教程中的java代码中的关键字,你可以在这里看到它,例如38分钟......
所以我的问题是,如何var在java代码中拥有它以及它在java中意味着什么,我们在没有特定类型的情况下不能有引用?