gpt4 book ai didi

java - AsyncTask源码问题

转载 作者:行者123 更新时间:2023-11-30 09:04:17 25 4
gpt4 key购买 nike

我正在阅读 AsyncTask.java并且有几个地方我无法理解。

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

    /** @hide Used to force static handler to be created. */
    public static void init() {
    sHandler.getLooper();
    }
  2. 为什么要将 postResultIfNotInvoked() 放在覆盖的 done() 方法中?怎么可能不调用呢?如果我没理解错的话,首先会调用mWorkercall() 方法,然后保证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. init() 并没有真正用在常规代码中。

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

    由于 @hide,它不能用于使用 SDK stub 版本的 android.jar 编写的代码。

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

关于java - AsyncTask源码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25322651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com