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                       }

 

posted on 2017-10-26 10:19  齊帥  阅读(136)  评论(0编辑  收藏  举报

导航