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

时间:2013-10-24 17:12:49

标签: java android multithreading android-asynctask

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

  

理想情况下,AsyncTasks应该用于短时间操作(几秒钟)   最多。)如果你需要保持线程长时间运行   时间,强烈建议您使用提供的各种API   java.util.concurrent pacakge,如Executor,ThreadPoolExecutor   和FutureTask。

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

是否正确

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

2 个答案:

答案 0 :(得分:4)

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

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

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

如果您的任务需要您的活动,那么您应该使用服务或ServiceIntent。前者有点复杂,因为您必须管理其生命周期,但提供更大的灵活性。第二个是该死的直截了当所以我可以举个例子:

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);
}
}

如果你的活动是

,你可以开始
Intent i = new Intent(context, MyIntentService.class);
context.startService(i);

答案 1 :(得分:3)

AsyncTasks不遵循Activity实例的生命周期。如果在Activity中启动AsyncTask并旋转设备,则将销毁Activity并创建新实例。但AsyncTask不会死。这是建议避免长时间运行任务的AsyncTask的原因之一。

我相信您的情况简单threading就足够了,因为您只下载数据。如果您需要更新UI元素,也可以使用处理程序。

修改

在FutureTask执行其工作期间,您无法更新UI。 UI只有在完成工作后才能更新。

A FutureTask can be used to wrap a Callable or Runnable object. Because FutureTask 
implements Runnable, a FutureTask can be submitted to an Executor for execution.