首页 > 代码库 > Handler的解析和使用

Handler的解析和使用

1.handler为android中多线程间通信的一种机制,

@1android中只允许在UI线程(主线程)操作或改变UI,其他线程不能操作UI。

@2其他线程有刷新UI的需要,所以得告诉UI线程,这时候就用到Handler,在handeMessage方法中处理消息。

@3handler可以定义在主线程也可以定义在其他线程,作用不一样。

@4与handler执行相关的类:Handler,Message,MessageQueue,Looper

UI线程:主线程,创建时会自动初始化一个Looper对象,也会创建一个消息队列

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。

Thread:线程,负责调度整个消息循环,即消息循环的执行场所。

2.handler的使用

@1用在主线程

---1-定义Handler对象,重写handleMessage方法,在方法里面处理消息,更新UI

    private Handler mHanlder = new Handler(){
        
        

        public void handleMessage(android.os.Message msg) {
            
            numberAdapter = new BlackNumberAdapter(getApplicationContext(), mList, mBnd);
            lv_blacknum.setAdapter(numberAdapter);
            
        };
        
    };

---2-在其他 线程发送消息,有时需要自己定义消息对象

mHanlder.sendEmptyMessage(BLACKNUM_PREPARED);

@2handler定义在子线程,需要自己创建Looper对象

----流程:

====1.调用Looper.prepare()为当前线程创建Looper对象,此时会自动创建MessageQueue消息队列;2.创建Handler对象,重写handleMessage方法;3.调用Looper.loop()方法启动Looper消息循环

Handler的解析和使用