java - 如何执行具有异步子任务的顺序任务

标签 java android multithreading concurrency

作为我的 Android 开发的一部分,我面临以下问题:

我需要执行顺序任务,但我的问题是每个任务都有异步子任务。在执行下一个任务之前,我需要确保最后一个任务已完成(这意味着所有异步子任务也已完成)。

我计划结合以下解决方案:

(1) ThreadPool 固定线程数设置为“1”。但是,这并不妨碍在每个异步子任务完成后执行下一个任务。

(2) BlockingQueue 在每个任务中调用阻塞 take() 方法等待来自异步子任务的完成信息。

我发现这种手工制作的方法不是很干净而且容易出错。

有人知道更好的解决方案吗?或者也许是一个可以优雅地解决这个问题的库?

最佳答案

您可以利用 RxJava 轻松地做到这一点:

Observable
    .concat(
        Observable.fromCallable(() -> yourAsyncTask1()),
        Observable.fromCallable(() -> yourAsyncTask2()))
    .subscribeOn(androidSchedulers.io())
    .observeOn(androidSchedulers.mainThread())
    .subscribe(() -> {
        doSomethingAfterBothFinished();
    });

RxJava 甚至允许您使用 onError 轻松处理错误。

如果一项任务依赖于另一项任务,您可以使用 map:

Observable
    .fromCallable(() -> yourAsyncTask1())
    .map((ResultType1 result1) -> {
        return yourAsyncTask2(result1);
    })
    .subscribeOn(androidSchedulers.io())
    .observeOn(androidSchedulers.mainThread())
    .subscribe(() -> {
        doSomethingAfterBothFinished();
    });

result1yourAsyncTask1() 的返回值。

请注意,subscribeOn() 之上的所有内容都将在后台线程中完成,而 observeOn() 之下的所有内容都将在主线程中完成。如果您想在任务完成后更新 UI,这将非常有用,因为这只能在 mainThread 上完成

关于java - 如何执行具有异步子任务的顺序任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948976/

相关文章:

java - 在自定义 BaseAdapter 子类中使用 butterknife 导致 "Unable to inject views"错误

java - 从另一个线程捕获异常?

java - 保理 try catch

java - 以 JSON 格式将行值发送到 Web 服务 (Android)

java - FFmpeg 命令帮助和文档指针

android - 多个应用程序连接到蓝牙问题

java - JTabbedPane中添加的选项卡不显示

android - 用于 httppost 的线程和异步任务任务

java - 在 JavaFX 2.0 中将标签置于节点的中心

java - 如果授权失败,Spring Controller 上的 @PreAuthorize 会发送重定向