Java 链接异步任务是否被视为不好的做法?
我正在编写一个具有以下功能的应用程序:Java 链接异步任务是否被视为不好的做法?,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我正在编写一个具有以下功能的应用程序: 解析网页并从中提取图像URL 将它们解码为位图,并在图像视图中显示它们 我不希望这些在UI线程上运行,显然第二点不能在第一点没有完成的情况下执行 我可以通过链接异步任务来实现这一点吗?我的意思是从第一个的onPostExecute()方法开始第二个 这被认为是不好的做法吗?如果是,我应该如何做 (这是一个理论问题,我不是在问代码) 我可以通过链接异步任务来实现这一点吗?我是说开始第二个 从第一个函数的onPostExecute()方法 唯一的限制是必须在U
位图
,并在图像视图中显示它们
onPostExecute()
方法开始第二个
这被认为是不好的做法吗?如果是,我应该如何做
(这是一个理论问题,我不是在问代码)
我可以通过链接异步任务来实现这一点吗?我是说开始第二个
从第一个函数的onPostExecute()方法
唯一的限制是必须在UI线程上实例化AsyncTask
。只要在UI线程上实例化它,就应该是安全的。所以答案是肯定的,你能做到
如果是,我应该如何做
解决同一问题有不同的方法。例如,您可以使用代理/监听器、观察者或广播接收者来通知任务的完成情况。当然,您可以。理论上,你上面提到的这个逻辑不会错。但是,您必须了解:
onPreExecute
和onPostExecute
在主线程上调用,即UI线程,而doInBackground
在另一个非主线程上调用。同时,如果在第一个任务的doInBackground
上执行第二个AsyncTask
,则第二个任务的onPreExecute
和onPostExecute
将不会在主线程上运行。注意这一点。嗯,我不认为这是不好的做法。我能看到的唯一缺点是,代码变得更难阅读,特别是如果你最终链接了大量回调。这是一个很好的答案,但既然你是在理论上提问,我会在最后附上一个意见
从AsyncTask文档:
AsyncTasks理想情况下应用于短期操作(最多几秒钟)。如果需要让线程长时间运行,强烈建议您使用java.util.concurrent包提供的各种API,如Executor、ThreadPoolExecutor和FutureTask
期货(或承诺)链接是一种完全正常的异步实践。未来A做某事并返回一个值;然后,这个值可以被另一个异步代码块使用,以此类推,形成一个逻辑处理链
在伪代码中,它如下所示:
Future( calculate and return x).map( consume x and return y)
.map ( consume y and so on)
您完全可以做到这一点,如果您确实需要,链接多个
异步任务也没有什么错。我想强调的是:只有在你真的必须的时候
异步任务
会带来一定的开销。如果将两个AsyncTasks
链接起来,则开销将增加一倍。你不会想要的。您应该尽可能少地使用AsyncTasks
在您的例子中,解决方案实际上似乎非常简单:只需在一个AsyncTask
中执行所有工作。问问自己:真的需要两个独立的异步任务吗?从你的描述来看,肯定不是这样。如果只使用一个AsyncTask
,则代码的运行效率将比使用两个任务时高得多
请注意,AsyncTasks
只应用于需要几秒钟的短操作,这些操作是响应用户操作而启动的。如果您需要在后台执行一些长时间运行的操作,那么AsyncTask
可能不是最佳解决方案。从您的描述中,我真的无法判断您想要做的事情是否适合异步任务
,但是如果您正在做的工作不符合我上面描述的标准,您可能最好选择一种替代解决方案。这是一种不错的做法。您可以链接异步任务,但在您的情况下,您必须确保它们按顺序发生。看到这个答案了吗