Handler消息机制原理:
在主线程创建handler,在构造方法中传入当前线程的looper并重写handleMessage方法。子线程通过handler的sendMessageAtTime发送消息,在sendMessageAtTime方法中获取主线程的消息队列,并将当前handler赋值给message中的target属性并通过消息队列的enqueueMessage方法将message插入到消息队列中。looper通过for死循环不断的访问消息队列中的next方法获取message,如果message不为空会调用message的target属性的dispatchMessage方法来分发消息,dispatchMessage最终会调用handleMessage方法,handleMessage的实现是在主线程中,所以此时消息已经由子线程传递到了主线程。
注意:
1.主线程会默认创建looper所以不需要传,其他线程需要手动创建looper并把它传入当前线程
2.因为主线程创建handler的时候传入了主线程的looper,主线程和子线程用的是一个handler对象,所以在子线程中也可以获得主线程的looper。因为创建looper的时候在looper的构造方法中创建了一个消息队列,所以获得主线程的looper就可以获取到主线程的消息队列了。
Handler线程切换原因
1.子线程可以获得到主线程的looper,消息队列,可以向主线程插入消息。
2.主线程可以从消息队列中获取到子线程传来的Message,通过Message可以获取到子线程的handler,获得到handler就可以通过dispatchMessage进行消息分发了,就可以调用handleMessage方法了,因为handleMessage在主线程实现了,所有主线程就能拿到子线程的message了