我正在创建一个可以下载大约30张图像的应用程序。假设需要10秒以上。我一直在阅读有关AsyncTask
的内容,我猜它不应该被使用,因为任务需要花费几秒钟。
理想情况下,AsyncTasks应该用于短时间操作(几秒钟) 最多。)如果你需要保持线程长时间运行 时间,强烈建议您使用提供的各种API java.util.concurrent pacakge,如Executor,ThreadPoolExecutor 和FutureTask。
在查看ASyncTask
的API时,我发现有些方法可以发布到UI线程。如果我理解正确的话,执行长期任务的更合适的方法是使用FutureTask
?这意味着我必须自己发布UI线程的更新。您使用post(Runnable)
method of View吗?
无论我是否走在正确的轨道上,我都需要一些指导。
答案 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.