消息机制
消息机制
梦想家Peng 发表于2年前
消息机制
  • 发表于 2年前
  • 阅读 42
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

消息机制
----------------------------------
Handler:用于发送消息、处理消息
Message:用于承载消息的数据
MessageQueue:消息队列,是若干消息的容器
Looper:消息队列的轮循者


消息的分发与处理
----------------------------------
【处理消息的方式】
方式1. 自定义类继承Handler,并重写handleMessage()
方式2. 自定义类实现Handler.Callback,重写接口中的抽象方法,并在创建Handler对象时,使用该类的对象作为Handler的构造方法的参数
方式3. 使用Message.obtain()方法获取Message对象时,指定Runnable callback,并在callback中处理消息

        // handler = new Handler(new InnerHandlerCallback());

    }
    
//    private class InnerHandlerCallback implements Handler.Callback {
//
//        @Override
//        public boolean handleMessage(Message msg) {
//            Intent intent = new Intent(GuideActivity.this, MainActivity.class);
//            startActivity(intent);
//            finish();
//            return false;
//        }
//        
//    }

【分发和处理原则】
如果存在方式3,则直接按照方式3处理,并结束;
如果不存在方式3,且存在方式2,则优先按照方式2处理;
如果方式2的Callback中抽象方法返回值为true,则直接处理结束,否则,按照方式2处理完成后还会按照方式1处理。
以上部分参考android.os.Handler类的dispathMessage()方法。


关于创建子线程的Handler
----------------------------------
必须先调用Looper.prepare(),才可以在子线程中创建Handler对象。
必须调用Looper.loop()才可以让轮循者开始轮循消息队列,如果没有调用,则轮循者不会自动开始工作,也就意味着发出的消息不会被处理!
Ps:主线程默认就会准备Looper对象并开始轮循,所以在主线程中创建Handler时不需要显式的操作Looper。


关于Handler运行在哪个线程
----------------------------------
结论:当创建Handler时,关联到哪个线程的Looper,则Handler就在哪个线程上处理消息,如果没有显式的指定Looper,则以创建Handler时所在的线程为准。


HandlerThread类
----------------------------------
HandlerThread的本质是一个线程类,在这个线程中,会准备并启用在子线程的Looper,开发者可以调用HandlerThread的getLooper()方法获取到运行在子线程的Looper对象,并用于创建运行在子线程的Handler。
注意:在调用getLooper()方法之前,必须先启动HandlerThread线程,即调用HandlerThread的start()方法。
用途:基于消息队列的“队列”特性,可以使用运行在子线程的Handler发出多个消息,那么,Handler在子线程中处理时会依次处理,并且,可以处理耗时操作。简言之:依次处理多个耗时操作。

    HandlerThread ht = new HandlerThread("");
        ht.start();
        Looper subLooper = ht.getLooper();
        handler = new Handler(subLooper, new InnerHandlerCallback());
    }
    
    private int count = 1;
    
    public void sendMessage(View v) {
        Message.obtain(handler, 0, count, 0).sendToTarget();
        count++;
    }
    
    private class InnerHandlerCallback implements Handler.Callback {

        @Override
        public boolean handleMessage(Message msg) {
            for (int i = 0; i < 10; i++) {
                Log.d("tag", "handleMessage[" + msg.arg1 + "] ... ...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
        
    }


共有 人打赏支持
粉丝 0
博文 33
码字总数 15605
×
梦想家Peng
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: