我知道在.net中,我可以在任务中执行类似的操作,
task.ContinueWith((v) =>
{
Operation1();
})
.ContinueWith((V) =>
{
Operation2();
},
Cancel.Token, TaskContinuationOptions.None, Scheduler);
return task;
或使用Aysnc / Await功能一一进行操作。
如何用Java做到这一点?
我已经阅读了AsyncTask的资料,但是在doInBackground中完成操作之后,onPostExecute(Result)中的方法仍然被同步调用。
所以我的问题是如何一个接一个地操作一系列不同的功能?
如果您对Rx感到满意,则可以使用RxJava。它不是很漂亮,但是可以工作:
final ExecutorService executor = Executors.newCachedThreadPool();
final ConnectableObservable<?> result = Observable.concat(
Observable.defer(
new Func0<Observable<?>>() {
@Override
public Observable<?> call() {
return Observable.from(
executor.submit(
new Runnable() {
@Override public void run() { task(1); }
}
)
);
}
}
),
Observable.defer(
new Func0<Observable<?>>() {
@Override
public Observable<?> call() {
return Observable.from(
executor.submit(
new Runnable() {
@Override public void run() { task(2); }
}
)
);
}
}
)
).replay();
result.connect();
可能有更好的方法来执行此操作,但是我不太了解RxJava API,因为我使用自己的Java Rx实现。
要点是:
concat()
运算符连接串行多观察序列。在这种情况下,每个序列都只是一个元素:任务的结果。defer()
有人订阅之前,操作员将阻止调度每个任务。在这种情况下,这会在前一个任务/序列终止时发生。from()
操作者一个变换Future<?>
成一个Observable<?>
。replay()
操作创建一个连接的可观察,确保任务的顺序只执行一次,即使有多个用户。结果将被捕获,因此晚期订户仍将收到它。connect()
开始执行任务序列。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句