AsyncTask面试误区
2021-01-08 本文已影响0人
东野圭吾_
网上我们经常能看到这样的解释:
AysncTask必须在UI线程中创建和执行,今天我们就来看一下。
以下是我的测试代码,发现没问题,觉得很奇怪。

接下来我们看看源码。它是有三个构造方法,

最后都走到了下面这个
此时我们会发现,在构造方法中,自动会创建主线程Handler,不管你的外部环境

此时我们又开始怀疑网上的说发,是网上的说法错误吗,还是我们没找到真正的原因?继续查找。
我找到了老一点的API(android-21),发现它只有一个构造方法

点开我们发现,并没有对Handler进行处理

我们最终发现在变量中创建了Handler

所以说如果外部在主线程,则Handler就是主线程的,如果是在子线程创建了AsyncTask,则Handler也就会在子线程中,而Handler又与Looper挂钩,子线程又没有Looper,导致无法更新UI的。
到此终于解开了谜团,希望能对大家有帮助。
有什么问题的话,欢迎指正。
源码让生活变得更美好。加油!