作为我的 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();
});
result1
是 yourAsyncTask1()
的返回值。
请注意,subscribeOn()
之上的所有内容都将在后台线程中完成,而 observeOn()
之下的所有内容都将在主线程中完成。如果您想在任务完成后更新 UI,这将非常有用,因为这只能在 mainThread 上完成
关于java - 如何执行具有异步子任务的顺序任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948976/