对于上下文,我是熟悉使用AsyncTask的Android开发人员,但最近开始研究一个大量使用Future的项目。期货没有回调,需要检查isDone()
以确定进度。
我无法理解Future的目的和用例是什么。 AsyncTask提供了看起来相同的功能,但在我看来是一个更好的接口,它内置了回调,使客户端能够清楚地确定异步操作何时完成而无需经常检查isDone()
。 / p>
Android中未来的用途和目的是什么?为什么我会在AsyncTask上使用Future或FutureTask?
答案 0 :(得分:2)
Future
是Java API的一部分,而AsyncTask
是特定于Android的。事实上,如果您查看source code of AsyncTask
,您会看到它实际上使用了FutureTask
来实现它:
/**
* Creates a new asynchronous task. This constructor must be invoked on the UI thread.
*/
public AsyncTask() {
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//noinspection unchecked
return postResult(doInBackground(mParams));
}
};
mFuture = new FutureTask<Result>(mWorker) {
@Override
protected void done() {
try {
postResultIfNotInvoked(get());
} catch (InterruptedException e) {
android.util.Log.w(LOG_TAG, e);
} catch (ExecutionException e) {
throw new RuntimeException("An error occured while executing doInBackground()",
e.getCause());
} catch (CancellationException e) {
postResultIfNotInvoked(null);
}
}
};
}
AsyncTask
因此只是一个用于短线程作业的辅助类,它也可以处理一些thread pooling。我的猜测是,您项目的原始作者熟悉Future
s,但不熟悉AsyncTask
,或者通常不喜欢AsyncTask
。
由于AsyncTask
处理问题,我不喜欢原始Exception
实施,因此我继续搜索更好的替代方案,并找到了RoboGuice's SafeAsyncTask。在此实现中,onException(Exception)
回调可用,但RuntimeException
也会传播到该回调。
我认为NullPointerException
应该让应用程序崩溃,我稍后修改了这个SafeAsyncTask
以完成此操作。结果可以找到here。