链接AsyncTasks被认为是不好的做法吗?

时间:2015-05-13 07:19:39

标签: java android multithreading android-asynctask

我正在编写执行以下操作的应用:

  1. 解析网页并从中提取图片网址
  2. 将其解码为Bitmap并在ImageView
  3. 中显示

    我不希望这些在UI线程上运行,显然第二点无法在第一点完成的情况下执行。

    我可以链接AsyncTasks来实现这一目标吗?我的意思是从第一个onPostExecute()方法开始第二个。

    这被认为是不好的做法吗?如果是这样,我该怎么做?

    (这是一个理论问题,我不是要求代码)

5 个答案:

答案 0 :(得分:3)

你绝对可以做到这一点,如果你真的需要链接多个AsyncTasks没有任何问题。我想强调:只有你真的需要

AsyncTasks带来一定的开销。如果你链接两个AsyncTasks,你会得到两倍的开销。你不想要那个。您应该使用最少量的AsyncTasks

在您的情况下,解决方案实际上看起来非常简单:只需一个AsyncTask执行所有工作。问问自己:真的需要两个独立的AsyncTasks吗?根据你的描述,它似乎并不像。如果您只使用一个AsyncTask,那么与使用两个代码相比,您的代码运行效率会更高。

请注意,AsyncTasks仅应用于需要几秒钟且响应用户操作而启动的简短操作。如果您需要在后台执行一些长时间运行的操作,那么AsyncTask可能不是最佳解决方案。我无法从你的描述中确切地告诉你,你想要做的事情是否适合AsyncTask,但如果你所做的工作不符合我上面描述的标准你用替代解决方案可能更好。

答案 1 :(得分:1)

  

我可以链接AsyncTasks来实现这一目标吗?我的意思是开始第二个   从第一个onPostExecute()方法

唯一的限制是必须在UI线程上实例化AsyncTask。只要您在UI线程上实例化它就应该是安全的。所以答案是肯定的,你可以做到。

  

如果是这样,我该怎么做?

有不同的方法来解决同样的问题。例如,你可以使用ExecutorService,代理/监听器,Observer或BroadcastReceiver来通知任务的完整性

答案 2 :(得分:1)

当然,你可以。从理论上讲,你上面谈到的这种逻辑可能是错误的。但是,您必须明白:在主线程上调用onPreExecuteonPostExecute,即在另一个非主线程上调用UI线程doInBackground。同时,如果您在第一个AsyncTask上执行了第二个doInBackground,则第二个伤口的onPreExecuteonPostExecute不会在主线程上运行。请注意这一点。

答案 3 :(得分:1)

对于here来说,这是一个很好的答案,但既然你理论上要求,我会在其结尾标记一个意见。

来自AsyncTask文档:

  

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

期货链(或Promises)是一种完全正常的异步实践。未来A做了某件事并返回了一个值;然后,该值可以由另一个异步代码块消耗,依此类推,形成逻辑处理链。

在伪代码中,它看起来像这样:

Future( calculate and return x).map( consume x and return y)
                               .map ( consume y and so on)

答案 4 :(得分:0)

嗯,我不认为这是不好的做法。我能看到的唯一缺点是代码变得有点难以阅读,特别是如果你最终链接了大量的回调。