您的位置:首页 > 移动开发 > Android开发

Handler的工作原理

2016-12-16 16:44 204 查看
handler是Android中实现线程之间通信用的,遵照先进先出原则。下面就说说handler的用法及原理~~


1、在主线程里面实例化一个Handler ,用于接收子线程发过来的消息,接收到消息后更新主线程里的TextView的值
代码如下:
Handlerhandler=newHandler(){
@Override
public voidhandleMessage(Message
msg) {
super.handleMessage(msg);
Log.i("子线程过来的",msg.obj.toString());
txt.setText(msg.obj.toString());
}
};

2、在子线程里面要把网络请求回来的数据发送到主线程里来,实例化Message对象,再调用它的方法。
代码如下:
str1是网络请求回来的数据
Message message=newMessage();
message.obj=str1;
handler.sendMessage(message);

▶ handler 中用于事件分发的一些方法有:
post是工作在主线程的可以更新UI

post(Runnable) 发送的是一个Runnable对象
postAtTime(Runnable,long)
postDelayed(Runnable long) 有延迟
把带数据的Message对象到队列中,等待更新
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
mHandler.removeCallbacks(mRunnable);移走当前的这个mRunnable
mProgressBar.setProgress(0);
作用:不同线程之间的通信及定时执行Message和Runnalbe对象 

post() 和 postDelayed(Runnable long);
mProgressRunable=new Runnable() {
public void run() {
mProgressLength=mProgressBar.getProgress()+1;
mProgressBar.setProgress(mProgressLength);
if(mProgressLength<100){

MainActivity.this.mHandler.postDelayed(mProgressRunable,1000);
}
}

下面说说handler原理:
Message:可以存储信息的消息体
Handler:负责分发消息
MessageQueue:负责存储消息
Looper:负责对消息进行轮询处理
数据结构图:
    


Message:消息
MessageQueue:消息队列用于存放message
MessageQueue虽说叫消息队列但是内部不是一个队列而是一个单链表
它只有两个动作:插入,读取
对应的方法是 enqueueMessage() 和 next()
enqueueMessage() :往里放消息
next() :从消息队列里面读出消息并且将该消息移除
这里面的读取是有点特别的,它是一个无限循环的方法,如果消息队列中没有消息,那么next方法会一直阻塞,当有新的消息来时,就会取出消息并将其从单链表(MessageQueue)中删除
Looper:它是不停的从MessageQueue中查看是否有新消息如果有就立马处理,否则阻塞 handler 的工作需要Looper ,没有Looper的线程会报错,如何为一个线程创建一个looper,looper.prepare();
创建好之后接着通过looper.loop()开启消息循环是looper比较重要的一个方法只有调有了loop消息循环才会真正的起作用 ,loop就是一个死循环,只有 MessageQueue 中的next返回null时才会跳出来
looper还有如下方法:
prepareMainLooper这个方法是给主线程的Looper使用的本质也是通过prepare方法来实现的
getMainLooper或取主线程的Looper
quit:直接退出
quitSafely:只是设定一个标记然后把消息队列中的已有消息处理完后才安全的退出
如是在子线程中自己手动的创建一个looper 要记得调用退出,否则这个线程会一直处于等待状态
Handler:主要是处理发送和接收消息的
handler消息的发送通过post 或者sendMessage等
也就是说handler会发一个消息到MessageQueue 中然后MessageQueue 的next方法会把这个消息返回给looper 最后消息由looper交给handler来处理此时 handler会调有dispatchMessage方法

下面说说handler原理:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 线程 通信 工作