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

时间:2016-12-03 14:44:26

标签: java android multithreading concurrency

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

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

我打算将以下解决方案结合起来:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以利用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()以下的所有内容都将在mainThread上完成。如果您想在任务完成后更新UI,这非常有用,因为这只能在mainThread上完成