作为Android开发的一部分,我面临以下问题:
我需要执行顺序任务,但我的问题来自每个任务都有异步子任务的事实。在执行下一个任务之前,我需要确保上一个任务完成(这意味着所有异步子任务也已完成)。
我打算将以下解决方案结合起来:
(1)ThreadPool
,其中固定数量的线程设置为“1”。但是,这并不妨碍在每个异步子任务完成后执行下一个任务。
(2)BlockingQueue
在每个任务中调用阻塞take()
方法,等待来自异步子任务的完成信息。
我发现这种手工制作的方法不是很干净且容易出错。
任何人都知道更好的解决方案吗?或者也许是一个优雅地解决这个问题的库?
答案 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();
});
其中result1
是yourAsyncTask1()
返回的值。
请注意,subscribeOn()
以上的所有内容都将在后台线程上完成,因为observeOn()
以下的所有内容都将在mainThread上完成。如果您想在任务完成后更新UI,这非常有用,因为这只能在mainThread上完成