Handler

作者: EvilsoulM | 来源:发表于2015-11-08 22:24 被阅读123次

    一, 为什么要设计handler

    handler根本的目的就是解决多线程并发的问题。

    • 如果一个界面中有多个线程去更新UI,并且都没有加锁机制,那么就将导致界面错乱(类似于多线程买票,买到负数)
    • 但是我们都加锁的话将会导致性能下降
      所以android给我们提供了一套更新UI的机制,我们只需要遵循这样的机制就可以了。根本不用去关心多线程的问题,所以更新UI的操作,都是在主线程的消息队列中去轮询处理的

    二,handler,MessageQueue,Looper之间的关系

    Looper

    • 内部包含一个消息队列MessageQueue,所有的Handler发送的消息都走向这个消息队列
    • Looper.looper 方法,就是一个死循环,不断的从MessageQueue取消息,如果有消息就处理消息,没有消息就阻塞

    MessageQueue

    • 消息队列,可以添加消息,并处理消息

    Handler

    • 内部会和Looper进行关联,也就是说在Handler的内部也可以找到Looper,找到了Looper也就找到了,MessageQueue,在Handler中发送消息,其实就是向MessageQueue队列中发送消息
    • Handler封装了消息的发送(主要包括消息发送给谁)

    Handler负责发送消息,Looper负责接收Handler发送的消息,并直接把消息会传给Handler自己,MessageQueue就是一个储存消息的容器

    三,源码分析

    四,例子

     class TestThread extends Thread {
            public Handler handler;
            public Looper looper;
            @Override
            public void run() {
                looper= Looper.prepare();//拿到looper
                handler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                    }
                };
                Looper.loop();//开启队列循环
            }
        }
    
      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_custom_error);
    
            TestThread thread = new TestThread();
            thread.handler.sendEmptyMessage(0);//发送消息给子线程handler处理
    }
    

    相关文章

      网友评论

          本文标题:Handler

          本文链接:https://www.haomeiwen.com/subject/loochttx.html