消息机制

消息机制
----------------------------------
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;
        }
        
    }


转载于:https://my.oschina.net/dreamerspace/blog/629795

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值