AsyncTask面试误区

2021-01-08  本文已影响0人  东野圭吾_

网上我们经常能看到这样的解释:

AysncTask必须在UI线程中创建和执行,今天我们就来看一下。

以下是我的测试代码,发现没问题,觉得很奇怪。

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

最后都走到了下面这个

此时我们会发现,在构造方法中,自动会创建主线程Handler,不管你的外部环境

此时我们又开始怀疑网上的说发,是网上的说法错误吗,还是我们没找到真正的原因?继续查找。

我找到了老一点的API(android-21),发现它只有一个构造方法

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

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

所以说如果外部在主线程,则Handler就是主线程的,如果是在子线程创建了AsyncTask,则Handler也就会在子线程中,而Handler又与Looper挂钩,子线程又没有Looper,导致无法更新UI的。

到此终于解开了谜团,希望能对大家有帮助。

有什么问题的话,欢迎指正。

源码让生活变得更美好。加油!

上一篇下一篇

猜你喜欢

热点阅读