我正在编写执行以下操作的应用:
Bitmap
并在ImageView
我不希望这些在UI线程上运行,显然第二点无法在第一点完成的情况下执行。
我可以链接AsyncTasks来实现这一目标吗?我的意思是从第一个onPostExecute()
方法开始第二个。
这被认为是不好的做法吗?如果是这样,我该怎么做?
(这是一个理论问题,我不是要求代码)
答案 0 :(得分:3)
你绝对可以做到这一点,如果你真的需要链接多个AsyncTasks
没有任何问题。我想强调:只有你真的需要。
AsyncTasks
带来一定的开销。如果你链接两个AsyncTasks
,你会得到两倍的开销。你不想要那个。您应该使用最少量的AsyncTasks
。
在您的情况下,解决方案实际上看起来非常简单:只需一个AsyncTask
执行所有工作。问问自己:真的需要两个独立的AsyncTasks
吗?根据你的描述,它似乎并不像。如果您只使用一个AsyncTask
,那么与使用两个代码相比,您的代码运行效率会更高。
请注意,AsyncTasks
仅应用于需要几秒钟且响应用户操作而启动的简短操作。如果您需要在后台执行一些长时间运行的操作,那么AsyncTask
可能不是最佳解决方案。我无法从你的描述中确切地告诉你,你想要做的事情是否适合AsyncTask
,但如果你所做的工作不符合我上面描述的标准你用替代解决方案可能更好。
答案 1 :(得分:1)
我可以链接AsyncTasks来实现这一目标吗?我的意思是开始第二个 从第一个onPostExecute()方法
唯一的限制是必须在UI线程上实例化AsyncTask
。只要您在UI线程上实例化它就应该是安全的。所以答案是肯定的,你可以做到。
如果是这样,我该怎么做?
有不同的方法来解决同样的问题。例如,你可以使用ExecutorService,代理/监听器,Observer或BroadcastReceiver来通知任务的完整性
答案 2 :(得分:1)
当然,你可以。从理论上讲,你上面谈到的这种逻辑可能是错误的。但是,您必须明白:在主线程上调用onPreExecute
和onPostExecute
,即在另一个非主线程上调用UI线程doInBackground
。同时,如果您在第一个AsyncTask
上执行了第二个doInBackground
,则第二个伤口的onPreExecute
和onPostExecute
不会在主线程上运行。请注意这一点。
答案 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)
嗯,我不认为这是不好的做法。我能看到的唯一缺点是代码变得有点难以阅读,特别是如果你最终链接了大量的回调。