网上我们经常能看到这样的解释:
AysncTask必须在UI线程中创建和执行,今天我们就来看一下。
以下是我的测试代码,发现没问题,觉得很奇怪。
![](https://img.haomeiwen.com/i13097226/982fafd34a4b5227.png)
接下来我们看看源码。它是有三个构造方法,
![](https://img.haomeiwen.com/i13097226/36ea1b4d0ed4ec3e.png)
最后都走到了下面这个
此时我们会发现,在构造方法中,自动会创建主线程Handler,不管你的外部环境
![](https://img.haomeiwen.com/i13097226/80308f102cc275ae.png)
此时我们又开始怀疑网上的说发,是网上的说法错误吗,还是我们没找到真正的原因?继续查找。
我找到了老一点的API(android-21),发现它只有一个构造方法
![](https://img.haomeiwen.com/i13097226/21911a1e626ae9e7.png)
点开我们发现,并没有对Handler进行处理
![](https://img.haomeiwen.com/i13097226/ff796f20fec180ba.png)
我们最终发现在变量中创建了Handler
![](https://img.haomeiwen.com/i13097226/69e8413cf34f053e.png)
所以说如果外部在主线程,则Handler就是主线程的,如果是在子线程创建了AsyncTask,则Handler也就会在子线程中,而Handler又与Looper挂钩,子线程又没有Looper,导致无法更新UI的。
到此终于解开了谜团,希望能对大家有帮助。
有什么问题的话,欢迎指正。
源码让生活变得更美好。加油!
网友评论