Handler消息机制原理:
1.在主线程创建mHandler,在构造方法中传入主线程的looper(主线程不需要手动传递,默认会传,其他线程需要手动传递)并重写handleMessage方法。子线程通过mHandler的sendMessageAtTime发送消息,在sendMessageAtTime方法中获取主线程的消息队列,并将当前mHandler赋值给message中的target属性并通过消息队列的enqueueMessage方法将message插入到消息队列中。
2.looper通过for死循环不断的访问消息队列中的next方法获取message,如果message不为空会调用message的target属性的dispatchMessage方法来分发消息,dispatchMessage最终会调用handleMessage方法,由于message中的target中的handler就是主线程的mHandler,所以会调用主线程中的handleMessage,所以此时可以在主线程的handleMessage中更新UI了,消息也已经由子线程传递到了主线程。
例子:
谈谈Android中的HandlerThread_Mr Lee_的博客-CSDN博客_android handlerthread
注意:
1.主线程会默认创建looper所以不需要传,其他线程需要手动创建looper并把它传入当前线程
2.创建looper的时候在looper的构造方法中会创建了一个消息队列
Handler发送消息
1.sendEmptyMessageAtTime(int what, long uptimeMillis)//发送延时消息。第二个参数的意思uptimeMillis秒之后发送消息,以系统开机时间为标准。(如果系统开机时间到此时正好是uptimeMillis秒,那么就会立即执行并发送消息)。
2.sendMessageAtTime(Message msg, long uptimeMillis)//发送延时消息。第二个参数的意思uptimeMillis秒之后发送消息,以系统开机时间为标准。(如果系统开机时间到此时正好是uptimeMillis秒,那么就会立即执行并发送消息)。
3.sendMessageDelayed(Message msg, long delayMillis)//发送延时消息。第二个参数的意思delayMillis秒之后发送消息,以系统当前时间为标准。(系统当前时间delayMillis秒之后发送消息)。
4.sendEmptyMessageDelayed(int what, long delayMillis) //发送延时消息。第二个参数的意思delayMillis秒之后发送消息,以系统当前时间为标准。(系统当前时间delayMillis秒之后发送消息)。
HandlerThread:
A线程要想向B线程通信,B线程必须要在handler的构造方法中传入B线程的looper并且重写handleMessage方法。
以前:需要在B线程中通过Looper.prepare()和Looper.loop()手动创建looper
现在:通过HandlerThread.getLooper()就可以获取到looper了,不需要手动创建