2

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

AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。

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

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

4

2 回答 2

4

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

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

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

如果您需要您的任务来维持您的活动,那么您应该使用服务或服务意图。前者稍微复杂一些,因为您必须管理其生命周期,但提供了更大的灵活性。第二个非常简单,所以我可以在这里举个例子:

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);
于 2013-10-24T18:09:34.063 回答
3

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

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

编辑:

在 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.
于 2013-10-24T17:43:58.840 回答