我正在阅读AsyncTask.java并且我无法理解的地方很少。
这段代码实际上做了什么?从评论来看它应该创建处理程序,但我无法知道如何做到这一点。 getLooper()
类中的方法Handler
只返回处理程序,因此我无法看到它可以初始化新的处理程序。
/** @hide Used to force static handler to be created. */
public static void init() {
sHandler.getLooper();
}
为什么将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);
}
}
};
答案 0 :(得分:2)
init()
并未真正用于常规代码。
它可以在平台测试代码中使用 - 首先调用它会使类加载器初始化当前线程上的静态成员。例如,当测试在后台线程上运行时,确保在主UI线程上创建Handler
非常有用。
由于@hide
,它在使用SDK的存根版android.jar
编写的代码中不可用。
这是fix a bug to make sure onCancelled()
is called if cancel()
is called early。