链接异步任务被认为是不良实践吗?

5
我正在编写一个应用程序,它会执行以下操作:
  1. 解析网页并从中提取图像URL
  2. 将它们解码为 Bitmap 并在 ImageView 中显示
我不希望这些在 UI 线程上运行,显然第 2 点需要完成第 1 点。
我可以使用 AsyncTasks 链来实现吗?我的意思是从第一个任务的 onPostExecute() 方法中启动第二个任务。
这被认为是不良做法吗?如果是,我应该如何处理?
(这是一个理论问题,我不要求代码)

这不是坏习惯。你可以链接AsyncTask,但在你的情况下,你必须确保它们按顺序发生。请参见此答案https://dev59.com/BGYs5IYBdhLWcg3wAfEi - Samvid Kulkarni
5个回答

3
如果确实必须这样做,那么您绝对可以这样做,同时将多个AsyncTasks链接在一起也没有什么问题。但是需要强调的是:只有在真正需要时才这样做。
使用AsyncTasks会带来一定的开销。如果链接两个AsyncTasks,则开销就会增加一倍。您不想这样。应尽可能少地使用AsyncTasks。
在您的情况下,解决方案似乎非常简单:只需在一个AsyncTask中执行所有工作即可。请问自己:是否真的需要两个独立的AsyncTasks?根据您的描述,似乎并不需要。如果只使用一个AsyncTask,您的代码将比使用两个AsyncTasks更高效。
请注意,AsyncTasks只适用于需要几秒钟完成且响应用户操作的短操作。如果需要在后台执行某些长时间运行的操作,则AsyncTask可能不是最佳解决方案。根据您的描述,我无法确定您要执行的工作是否适合使用AsyncTask,但如果您的工作不符合上述标准,则可能最好选择其他解决方案。

1
我能够链接AsyncTasks来实现这个吗?我的意思是从第一个任务的onPostExecute()方法开始第二个任务。
唯一的限制是AsyncTask必须在UI线程上实例化。只要您在UI线程上实例化它,就应该是安全的。所以答案是肯定的,您可以这样做。
如果可以,那么我该怎么做呢?
有不同的方法来解决同样的问题。例如,您可以使用{{link1:ExecutorService}},Delegate / Listener,Observer或BroadcastReceiver来通知任务的完成情况。

1
当然可以。理论上,你上面提到的逻辑不能错。但是,你必须要明白:onPreExecuteonPostExecute在主线程上被调用,也就是UI线程,而doInBackground则在另一个非主线程上运行。同时,如果你在第一个AsyncTaskdoInBackground中执行了第二个AsyncTask,那么第二个任务的onPreExecuteonPostExecute将不会在主线程上运行。请注意这一点。

1

这里有一个很好的答案here,但是由于你是在理论上提问,我会在结尾处加上一些看法。

根据AsyncTask文档:

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

将Futures(或Promises)链接起来是完全正常的异步实践。Future A执行某些操作并返回一个值;然后另一个异步代码块可以消耗这个值,以此类推,形成一个逻辑处理链。

伪代码如下:

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接