java - 在 Android 上执行长时间运行的任务时选择哪种策略?

标签 java android multithreading android-asynctask

我正在创建一个将下载大约 30 张图像的应用程序。假设它需要超过 10 秒。我一直在阅读有关 AsyncTask 的内容,我想它不应该被使用,因为该任务将花费超过几秒钟的时间。

AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge such as Executor, ThreadPoolExecutor and FutureTask.

在查看 ASyncTask 的 API 时,我发现有一些方法可以发布到 UI 线程。如果我理解正确的话,执行长时间运行任务的更合适的方法是使用 FutureTask?这意味着我必须自己将更新发布到 UI 线程。您使用 post(Runnable) method of View 是否正确? ?

无论我是否在正确的轨道上,我都可能需要一些指导。

最佳答案

您可以将短操作理解为与 Activity 的生命周期相关的操作。

您可以使用在 UI 线程上执行的 onProgressUpdate() 回调来更新 UI。

但是,如果您的 Activity 在此过程中继续暂停,这很可能会崩溃,因此您应该使用 task.cancel(true) 在 onPause() 中取消您的任务;

如果您需要您的任务在您的 Activity 中存活下来,那么您应该使用 Service 或 ServiceIntent。前者有点复杂,因为您必须管理它的生命周期,但提供了更大的灵 active 。第二个非常简单,所以我可以在这里给你举个例子:

public class MyIntentService extends IntentService{

public MyIntentService() {
    super("MyIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {
    // Background work in a worker thread (async)

    // You could also send a broadcast if you need to get notified
    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction("whatever");
    LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
}
}

你可以从你的 Activity 开始

Intent i = new Intent(context, MyIntentService.class);
context.startService(i);

关于java - 在 Android 上执行长时间运行的任务时选择哪种策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572337/

相关文章:

java - javadoc 对算法工作原理的解释应该有多深入?

java - 如何循环回到 TRY 语句的开头?

java - 使用 Lars Vogel "Eclipse Products and Deployment - Tutorial"创建 Eclipse RCP 应用程序

java - 如何从选项卡 Activity 中的另一个 Activity 调用一个 Activity

android - 使用线程时在android中获取强制关闭错误

java - 如何检测 OutofMemoryError 的原因?

java - Java 中子类和集合之间的类转换异常问题

java - 在卡片 View 中使用时,Android 中带有圆角的 Persistent Bottom Sheet 会崩溃

java - 如何定期更新 Firebase 实时数据库的位置?

c++ - VNC 查看器实现