其实Android是基于消息机制的,通过Looper、Handler来实现消息循环,在线程间相互通讯.Looper里保存了消息列表,通过Handler发送的消息都会保存在Looper里先,然后在loop()方法里,遍历消息列队,分发消息.Handler负责传送消息,处理消息.So,多线程通讯的原理就是,通过另一个线程handler来发送消息,因为Android里主要是跟UI线程通讯,所以一般就在UI线程创建Handler,在工作线程调用这个Handler来发送消息,但并不表示只有UI线程才能有Hanlder,其实要跟UI线程通讯,Handler在哪创建不是重点,重点是,创建这个Handler时使用的Looper对象在哪.
UI线程默认会创建Looper,而工作线程(就是用户自己创建,用于处理耗时操作)默认没有Looper,所以,可以直接在UI线程new Handler,但是在工作线程,需要先调Looper.prepare(),给当前线程创建Looper对象.
如果是调用没有参数的构造方法创建Handler,即new Hanlder(),默认使用的是当前线程的Looper对象.
所以,在工作线程中先Looper.prepare(),再new Hanlder(),这样的Handler是无法与UI线程通讯的.但是Handler还有个带Looper对象参数的构造方法,传入主线程的Looper,另外,Looper类有个静态获取主线程Looper对象的方法:Looper.getMainLooper()
so,在工作线程中创建与UI线程通讯的Handler,可以这样:
Handler mHandler=new Handler(Looper.getMainLooper());
无需再传入UI线程的Looper或者Handler对象作参数.
handle的思考
最新推荐文章于 2024-09-28 02:51:40 发布