Android Future的用例是什么?

时间:2015-02-10 16:46:45

标签: android android-asynctask

对于上下文,我是熟悉使用AsyncTask的Android开发人员,但最近开始研究一个大量使用Future的项目。期货没有回调,需要检查isDone()以确定进度。

我无法理解Future的目的和用例是什么。 AsyncTask提供了看起来相同的功能,但在我看来是一个更好的接口,它内置了回调,使客户端能够清楚地确定异步操作何时完成而无需经常检查isDone()。 / p>

Android中未来的用途和目的是什么?为什么我会在AsyncTask上使用Future或FutureTask?

1 个答案:

答案 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