Can't toast on a thread that has not called Looper.prepare()
Toast源码:
从使用Toast的方法着手:
查看makeText 已经得知looper的传参是null, 那么关注构造函数的Looper
继续关注looper
继续关注looper 因为知道为null 会走Looper.myLooper() 可以看到抛出错误的地方,那么Looper.myLooper() 获取结果为null
继续追踪:
Looper源码: 由Looper.myLooper获取looper
Looper源码: 在ThreadLocal保存looper. 注释可见在子线程中必须要调用prepare()才可以使用loopper
ThreadLocal源码 : 使用ThreadLocal的get()方法 先获取当前线程,然后获取到当前线程的ThreadLocalMap对象:
Looper源码: 结合上边代码 可知 在这创建了looper并设置给ThreadLocal 这就是为啥注释说必须先prepare().
ThreadLocal源码: set方法注释