繁体   English   中英

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

[英]Which strategy to choose when doing long running tasks on Android?

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

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

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

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

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

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

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

如果您需要任务来维持活动,则应该使用Service或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);

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM