java - 为什么 Android 的 AsyncTask 没有实现 Future?

标签 java android android-asynctask future

在 Java 中,我已经习惯了使用 Futures .现在我在看安卓,AsyncTask实现几乎所有相同的方法并涵盖相似的生命周期。但是,如果我想保持一致并在我的所有代码中使用 Future,我必须将 AsyncTask 包装在一个愚蠢的包装器中,因为它实际上并没有实现 Future。

他们只需要添加一个 isDone()方法,这看起来很简单,然后添加 implements Future<Result> . (稍后添加:请参阅下面的答案,了解它有多么微不足道)。

任何 Android 专家都知道一些很好的理由/模糊的错误可能导致为什么还没有这样做?

最佳答案

通过阅读 AsyncTask.java 的实际代码,它实际上使用一个Future 任务,然后还有更多。 Future 是一个异步执行的任务。 AsyncTask 被安排在单个(或多个)后台线程的队列上。

AsyncTask 实际上比 Future 任务更“高级”。它在 Future 的功能之上进行了花哨的调度和优化。看看API介绍层就知道了。 Future 从 API 1.0 开始就引入了。 AsyncTask 对象是在 API 3 中引入的。

AsyncTask 有一个 Future 任务,而不是一个 Future。

AsyncTask.java

/**
 * 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);
            }
        }
    };
}

关于java - 为什么 Android 的 AsyncTask 没有实现 Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485482/

相关文章:

java - 如何在显示窗口之前更改 JavaFX 中的 FXML Controller 变量值?

java - 具有多行单元格渲染器的 JTable 打印非常奇怪

java - 仅用于可见单元格的 Gridview touchListener

java - android中实现AsyncTask和GridView的Fragment

java - 如何在不知道参数数量的情况下使用 java.lang.reflect 调用方法?

Java - split(regex, limit) 方法实际上是如何工作的?

java - 我的 RecyclerView 适配器出现错误,填充了 firebase 数据

安卓编译错误

android - onPostExecute 从未在 android 中调用过

android - 如何在执行 doInBackground() 时在 android 中显示进度微调器