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

2022-09-04 02:52:50

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

他们需要添加的只是一个方法,这似乎是微不足道的,然后添加。(稍后添加:请参阅下面的答案,了解它有多微不足道)。isDone()implements Future<Result>

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


答案 1

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

实际上,An 比任务更“优越”。它在 的功能之上进行了花哨的调度和优化。只需查看 API 引入级别。 从 API 1.0 开始就引入了。该对象是在 API 3 中引入的。AsyncTaskFutureFutureFutureAsyncTask

AsyncTask 具有 Future 任务,而不是 Future。

异步任务.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);
            }
        }
    };
}

答案 2

我仍然对“为什么”不使用AsyncTask for a Future的理论原因感兴趣。

但是,为了记录在案,我最终创建了自己的小类(如下所示)。如果你想要一个未来,只需扩展它而不是AsyncTask。IMO,一种比@Eng.Fouad在代码中访问私有mFuture的想法更干净的方式。(但是谢谢你的想法,它让我稍微研究了一下源代码!新浪网.

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

   @Override
   public boolean isDone() {
      return AsyncTask.Status.FINISHED == getStatus();
   }
}

推荐