java链接异步任务是否被认为是错误的做法?
我正在编写一个具有以下功能的应用程序:
- 解析网页并从中提取图像URL
- 将它们解码为
Bitmap
,并在ImageView
中显示它们
我不希望这些在UI线程上运行,显然第二点不能在第一点没有完成的情况下执行
我可以通过链接异步任务来实现这一点吗?我的意思是从第一个onPostExecute()
方法开始第二个
这被认为是不好的做法吗?如果是,我应该如何做
(这是一个理论问题,我不是在问代码)
你可以在下面搜索框中键入要查询的问题!
我正在编写一个具有以下功能的应用程序:
Bitmap
,并在ImageView
中显示它们我不希望这些在UI线程上运行,显然第二点不能在第一点没有完成的情况下执行
我可以通过链接异步任务来实现这一点吗?我的意思是从第一个onPostExecute()
方法开始第二个
这被认为是不好的做法吗?如果是,我应该如何做
(这是一个理论问题,我不是在问代码)
# 1 楼答案
我不认为这是不好的练习。我能看到的唯一缺点是代码变得更难阅读,尤其是如果你最终链接了很多回调
# 2 楼答案
你可以做到这一点,如果你真的需要的话,链接多个
AsyncTasks
也没有错。我想强调的是:只有在你真的必须的情况下AsyncTasks
会带来一定的开销。如果你把两个AsyncTasks
链接起来,你会得到两倍的开销。你不会想要的。你应该尽可能少地使用AsyncTasks
在您的例子中,解决方案实际上似乎非常简单:只需在一个
AsyncTask
中执行所有工作。扪心自问:真的需要两个独立的AsyncTasks
?从你的描述来看,肯定不是这样。如果只使用一个AsyncTask
,代码的运行效率将比使用两个时高得多请注意
AsyncTasks
只能用于需要几秒钟的短操作,这些操作是响应用户操作而启动的。如果需要在后台执行一些长时间运行的操作,那么AsyncTask
可能不是最好的解决方案。从你的描述中,我真的无法判断你想做的事情是否适合AsyncTask
,但如果你正在做的工作不符合我上面描述的标准,你可能最好有一个替代解决方案# 3 楼答案
当然可以。理论上,你上面提到的这个逻辑不会错。但是,您必须理解:
onPreExecute
和onPostExecute
在主线程上被调用,即UI线程,而doInBackground
在另一个非主线程上被调用。同时,如果在第一个的doInBackground
上执行第二个AsyncTask
,则第二个的onPreExecute
和onPostExecute
不会在主线程上运行。注意这一点# 4 楼答案
这个问题有一个很好的答案here但既然你是在理论上提问,我会在最后附上一个意见
从AsyncTask文档:
期货(或承诺)链接是一种完全正常的异步实践。未来A做某事并返回一个值;然后,这个值可以被另一个异步代码块使用,以此类推,形成一个逻辑处理链
在伪代码中,它如下所示:
# 5 楼答案
唯一的限制是
AsyncTask
必须在UI线程上实例化。只要在UI线程上实例化它,就应该是安全的。所以答案是肯定的,你可以做到解决同一个问题有不同的方法。例如,可以使用ExecutorService和委托/侦听器、观察者或广播接收器来通知任务的完成情况