这个坑比较隐晦, 一般不容易出现.
有可能在使用AsyncTask时, 明明就是在postResult()方法里设置UI, 却被告知不能在非UI线程设置UI的异常.
这实际上应用App启动时的一个bug. AsyncTask是在初始化的时候, 自己取当前的线程获取Looper. 但是问题来了,
当前线程可能并不是UI线程, 所以就导致了postResult()等原本应该在UI线程工作方法, 实际上在非UI线程.
谷歌在4.1以后版本里解决这个bug, 就是在应用启动时, 在UI线程里先调用了一次AsyncTask.init(). 这样在当前应用里, AsyncTask的Looper就是UI线程的Looper了.
但是在4.1以前的版本里, 使用AsyncTask前, 自行在UI线程里调用一下AsyncTask.init()吧
时间: 2024-10-10 22:56:54