简述子线程中能不能直接new一个Handler,为什么主线程可以主线程的Looper第一次调用loop方法,什么时候,哪个类 ?
参考答案:
在Android中,子线程确实不能直接new
一个Handler
,并期望它像在主线程中那样工作。这是因为Handler
需要与Looper
对象一起工作,而Looper
通常与特定的线程关联。
主线程为什么可以?
主线程(也称为UI线程)在Android应用启动时会自动为其创建一个Looper
对象。这是由ActivityThread
类在启动过程中完成的。因此,当你在主线程中创建一个Handler
时,它会绑定到这个线程已经存在的Looper
上,从而能够接收和处理消息和Runnable对象。
子线程中的情况
子线程默认情况下是没有Looper
的。如果你尝试在没有Looper
的线程中创建Handler
,会抛出RuntimeException
,告诉你需要调用Looper.prepare()
来初始化线程局部的Looper
对象。
如果你想在子线程中使用Handler
,你需要先调用Looper.prepare()
来创建Looper
,然后才能安全地创建Handler
。处理完所有消息后,你需要调用Looper.loop()
来启动消息循环。
何时和哪个类调用主线程的Looper.loop()
?
主线程的Looper.loop()
是在ActivityThread
类的main
方法中调用的。当Android应用启动时,系统会创建一个ActivityThread
实例,并在其main
方法中初始化主线程的Looper
并调用loop()
方法。这样,主线程就开始了一个无限循环,不断地从消息队列中取出消息并处理它们。
总结
- 主线程自动拥有
Looper
,因此可以直接创建和使用Handler
。 - 子线程默认没有
Looper
,需要显式调用Looper.prepare()
和Looper.loop()
来创建和启动消息循环,然后才能安全地使用Handler
。 - 主线程的
Looper.loop()
是在ActivityThread
的main
方法中调用的,这是Android应用启动过程的一部分。