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

use*_*300 12 java android future android-asynctask

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

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

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

Dri*_*anX 7

从阅读它的实际代码AsyncTask.java实际上使用一个Future任务,然后更多.A Future是在旅途中异步执行的任务.AsyncTask在一个(或池)后台线程的队列上调度An .

一个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);
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)


use*_*300 6

我仍然对"为什么"不使用AsyncTask进行未来的理论原因感兴趣.

但是,为了记录,我最终创建了自己的小班(如下所示).如果你想要一个Future,只需扩展它而不是AsyncTask.IMO,比@Eng.Fouad在代码中访问私有mFuture的想法更清晰.(但是感谢这个想法,它让我看了一下源代码!)YMMV.

public abstract class FutureAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> implements Future<Result>{

   @Override
   public boolean isDone() {
      return AsyncTask.Status.FINISHED == getStatus();
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 19分钟后......"我最终创建了自己的班级......".听起来你迫不及待地为自己找出答案哈哈. (2认同)

Mic*_*ton 1

AsyncTask太简单了。它适用于可能需要几秒钟的短任务,但您不想为此锁定 UI 线程。如果您确实需要一个Future,那么您的任务对于一个人来说可能太复杂了AsyncTask anyway.

AsyncTask您可以通过调用 来检查 an 的状态getStatus()。这将返回一个枚举,可以是Status.PENDING,Status.RUNNING或 之一Status.FINISHED

  • 我恳求你的观点与事实不同。 (5认同)