Android Handler研究(1)
1. 解决问题
跨线程通信问题(子线程执行耗时操作)
2. 原理
遍历消息队列(Handler Looper MessageQueue Message),其他线程填充消息队列.
3. 注意点
a. UI线程在ActivityThread自动初始化Looper.
b. 任意线程实现消息队列
1 new Thread(){ 2 3 run(){ 4 //1. 准备Looper对象 5 Looper.prepare(); 6 //2. 子线程创建Handler 7 handler = new Handler(){ 8 handlerMessage(){ 9 } 10 } 11 //3. 轮询方法 12 Lopper.loop(); 13 } 14 15 }.start();
c. 为什么主线程不会因为Looper.loop()死循环卡死?
利用Linux管道(Pipe/epoll),简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的messageQueue.next()中的nativePollOnce()方法里.
所以说,主线程大多数时候处于休眠状态,不会消耗大量cpu资源
d. 内存泄漏怎么处理?
PS:在Java中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用。
1 static class MyHandler extends Handler 2 { 3 WeakReference<Activity> mWeakReference; 4 public MyHandler(Activity activity) 5 { 6 mWeakReference=new WeakReference<Activity>(activity); 7 } 8 @Override 9 public void handleMessage(Message msg) 10 { 11 final Activity activity=mWeakReference.get(); 12 if(activity!=null) 13 { 14 if (msg.what == 1) 15 { 16 noteBookAdapter.notifyDataSetChanged(); 17 } 18 } 19 } 20 }
齊帥