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