一个线程有几个handler?
答:作为应用层的类时,一个线程允许同时存在多个handler,但是都属于一个Looper; hander作为通信机制时,仅有一套统信机制looper,安卓与主线程通信的跨线程通信底层都是通过looper;
一个线程对应一个Looper,一个Looper一个MessageQueue;
线程间统信的原理是怎样的?
handler发送msg流程:handler.sendMessage()->handler.enquenueMessage->MessageQueue.enqueueMessage;
主线程取消息/处理消息流程:Activity,main()->Looper.loop()->MessageQueue.next()->handler.dispatchMessage->handler.hanleMessage();
线程间的通信原理是内存共享(MessageQueue共享);
Handler内存泄漏的原因?为什么其他内部类没有过这种问题?
1 | //MainActivity.class |
handler在activity中使用时的持有链: statuc sThreadLocal->Looper->MessageQueue Message->Handler-MainActivity.this;
当handler执行delay消息时,jvm无法回收上面的持有链,导致内存泄漏;
1 | 解决方案: |
子线程多并发安全的使用handler:
1 | HandlerThread handlerThread = new HandlerThread("threadName"); |
message消息复用:
1 | mHandler.obtainMessage();//清空消息后复用message对象,大量new Message会存在内存抖动; |