有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java链接异步任务是否被认为是错误的做法?

我正在编写一个具有以下功能的应用程序:

  1. 解析网页并从中提取图像URL
  2. 将它们解码为Bitmap,并在ImageView中显示它们

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

我可以通过链接异步任务来实现这一点吗?我的意思是从第一个onPostExecute()方法开始第二个

这被认为是不好的做法吗?如果是,我应该如何做

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


共 (5) 个答案

  1. # 1 楼答案

    我不认为这是不好的练习。我能看到的唯一缺点是代码变得更难阅读,尤其是如果你最终链接了很多回调

  2. # 2 楼答案

    你可以做到这一点,如果你真的需要的话,链接多个AsyncTasks也没有错。我想强调的是:只有在你真的必须的情况下

    AsyncTasks会带来一定的开销。如果你把两个AsyncTasks链接起来,你会得到两倍的开销。你不会想要的。你应该尽可能少地使用AsyncTasks

    在您的例子中,解决方案实际上似乎非常简单:只需在一个AsyncTask中执行所有工作。扪心自问:真的需要两个独立的AsyncTasks?从你的描述来看,肯定不是这样。如果只使用一个AsyncTask,代码的运行效率将比使用两个时高得多


    请注意AsyncTasks只能用于需要几秒钟的短操作,这些操作是响应用户操作而启动的。如果需要在后台执行一些长时间运行的操作,那么AsyncTask可能不是最好的解决方案。从你的描述中,我真的无法判断你想做的事情是否适合AsyncTask,但如果你正在做的工作不符合我上面描述的标准,你可能最好有一个替代解决方案

  3. # 3 楼答案

    当然可以。理论上,你上面提到的这个逻辑不会错。但是,您必须理解:onPreExecuteonPostExecute在主线程上被调用,即UI线程,而doInBackground在另一个非主线程上被调用。同时,如果在第一个的doInBackground上执行第二个AsyncTask,则第二个的onPreExecuteonPostExecute不会在主线程上运行。注意这一点

  4. # 4 楼答案

    这个问题有一个很好的答案here但既然你是在理论上提问,我会在最后附上一个意见

    从AsyncTask文档:

    AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.

    期货(或承诺)链接是一种完全正常的异步实践。未来A做某事并返回一个值;然后,这个值可以被另一个异步代码块使用,以此类推,形成一个逻辑处理链

    在伪代码中,它如下所示:

    Future( calculate and return x).map( consume x and return y)
                                   .map ( consume y and so on)
    
  5. # 5 楼答案

    Can i chain AsyncTasks to achieve this? I mean starting the second one from the first one's onPostExecute() method

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

    If so, how should i do this?

    解决同一个问题有不同的方法。例如,可以使用ExecutorService和委托/侦听器、观察者或广播接收器来通知任务的完成情况