Android 未来的用例是什么?

What is the use case for a Android Future?

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

我无法理解 Future 在 Android 中的用途和用例。 AsyncTask 提供了看似相同的功能,但在我看来有一个更好的接口,它内置了回调,使客户端能够清楚地确定异步操作何时完成,而无需不断检查 isDone().

Android 中 Future 的用途和目的是什么,为什么我要使用 Future 或 FutureTask 而不是 AsyncTask?

Future is part of the Java API, whereas the AsyncTask is Android specific. In fact, if you take a look at the 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 只是短线程作业的助手 class,它还可以处理一些 thread pooling。我的猜测是您的项目的原始作者熟悉 Future,但不熟悉 AsyncTask,或者通常不喜欢 AsyncTask


因为我不喜欢原来的 AsyncTask 实现,因为它的 Exception 处理,我继续寻找更好的替代方案,并找到了 RoboGuice's SafeAsyncTask。在此实现中,onException(Exception) 回调可用,但 RuntimeException 也会传播到该回调。

我认为 NullPointerException 应该会使应用程序崩溃,我不久前修改了这个 SafeAsyncTask 来做到这一点。结果可以查到here.