之前突然有人问我,在非UI线程能不能用Toast。我记得是可以的,因为之前在service里面都能toast,service是没有UI的。也经常都有全部activity都没了toast还在的情况。
而且toast的第一个参数就是个context,我觉得一般有context的东西,都不依赖其他东西的。(未验证,主观臆断,求高手告知)
然后我本着负责的精神试了一下,居然会报错,但是错误信息很诡异,居然是:
12-20 06:19:34.435: E/AndroidRuntime(539): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
如果是线程不能用UI的话,肿么会报一个这个线程没有消息队列不能用handler的错误?
然后我就翻了翻源码(具体略),发现Toast里面需要一个handler来处理内部的消息,然后我在线程里面加上了 Looper . prepare() 和 Looper . loop(),果然就可以了。
所以toast要的不是主线程,他要的只是一个handler。