Java 链接异步任务是否被视为不好的做法?

Java 链接异步任务是否被视为不好的做法?,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我正在编写一个具有以下功能的应用程序: 解析网页并从中提取图像URL 将它们解码为位图,并在图像视图中显示它们 我不希望这些在UI线程上运行,显然第二点不能在第一点没有完成的情况下执行 我可以通过链接异步任务来实现这一点吗?我的意思是从第一个的onPostExecute()方法开始第二个 这被认为是不好的做法吗?如果是,我应该如何做 (这是一个理论问题,我不是在问代码) 我可以通过链接异步任务来实现这一点吗?我是说开始第二个 从第一个函数的onPostExecute()方法 唯一的限制是必须在U

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

  • 解析网页并从中提取图像URL
  • 将它们解码为
    位图
    ,并在
    图像视图中显示它们
  • 我不希望这些在UI线程上运行,显然第二点不能在第一点没有完成的情况下执行

    我可以通过链接异步任务来实现这一点吗?我的意思是从第一个的
    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
    可能不是最佳解决方案。从您的描述中,我真的无法判断您想要做的事情是否适合
    异步任务
    ,但是如果您正在做的工作不符合我上面描述的标准,您可能最好选择一种替代解决方案。

    这是一种不错的做法。您可以链接异步任务,但在您的情况下,您必须确保它们按顺序发生。看到这个答案了吗