AsyncTask源代码问题

时间:2014-08-15 07:21:27

标签: java android concurrency android-asynctask

我正在阅读AsyncTask.java并且我无法理解的地方很少。

  1. 这段代码实际上做了什么?从评论来看它应该创建处理程序,但我无法知道如何做到这一点。 getLooper()类中的方法Handler只返回处理程序,因此我无法看到它可以初始化新的处理程序。

    /** @hide Used to force static handler to be created. */
    public static void init() {
        sHandler.getLooper();
    }
    
  2. 为什么将postResultIfNotInvoked()置于重写done()方法中?怎么不被调用?如果我理解这一点,首先会调用call() mWorker方法,然后保证mTaskInvoked为真。

    mWorker = new WorkerRunnable<Params, Result>() {
        public Result call() throws Exception {
            mTaskInvoked.set(true);
            //...
            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);
            }
        }
    };
    

1 个答案:

答案 0 :(得分:2)

  1. init()并未真正用于常规代码。

    它可以在平台测试代码中使用 - 首先调用它会使类加载器初始化当前线程上的静态成员。例如,当测试在后台线程上运行时,确保在主UI线程上创建Handler非常有用。

    由于@hide,它在使用SDK的存根版android.jar编写的代码中不可用。

  2. 这是fix a bug to make sure onCancelled() is called if cancel() is called early