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

野人学Android第二弹——Handler与Thread之间的关系

2015-11-15 17:15 387 查看
在Android的世界里,提到Handler,那么势必要提到Thread。Thread是什么呢?很简单,就是“线程”的意思,通俗点讲,就是“一心二用”,在同一阶段进行多个任务。任务与任务之间是相对独立运行的,但是进行消息的传递,将次线程的结果告诉主线程,否则就失去了线程的意义。那么,Handler就是担任这个消息传递的角色。在比较正式的名词解释中,Handler是线程之间消息传递与处理的机制。
上面的解释有点抽象,不太好理解,那么下面来点代码,看下Thread和Handler之间的配合是怎样的。

Handler handler = new Handler(){//在主线程中实例化一个Handler
@Override
public void handleMessage(Message msg) {//handleMessage()是Handler处理消息的方法,可以将传递过来的消息进行处理,也可以直接用来更新UI

super.handleMessage(msg);
Log.i("info", msg.obj);//msg这个参数包括what,arg1,arg2,obj四个属性,这是和obtainMessage()相对应的,至于这四个属性的含义,请查下手册
}
};
Thread thread = new Thread(new Runnable() {

@Override
public void run() {
Message msg = handler.obtainMessage(1,11,11,"message from thread");//实例一个message,就是线程之间要传递的消息
handler.sendMessage(msg);//将封装好的消息传递出去

}
});
thread.start();//启用次线程,如果没有start(),那么次线程就不会启用


这只是一个很简单的Handler与Thread的例子。基本逻辑:在主线程中实例化Handler,然后在次线程中将封装好的消息传递出去,主线程的handerMessage方法会接收到消息,进行消息的处理。其实,我刚才的解释有点不严谨,因为我还没有介绍Looper和MessageQueue这两个概念。先来看一张原理图。



原理解释:首先,Handler通过sendMessage这一方法将message传递到MessageQueue中,而Looper是循环机制,一旦MessageQueue中存在message,就会循环操作,传递给Handler的handleMessage方法进行操作。
关于这个原理图,需要强调的有几点:

1.一个线程只有一个Looper和MessageQueue;
2.MessageQueue和Looper是一一对应的;
3.一个MessageQueue和Looper可以对应多个Handler,但是一个Handler只能对应一个MessageQueue和Looper;
4.每个线程,包括主线程,实例化Handler,就需要创建Looper与调用,方法如下:创建,Looper.prepare();获取,Looper.myLooper();循环,Looper.loop();
5.主线程的Looper已经默认生成,所以就不需要另外创建;
6.MessageQueue的传出是按照“先进先出”的原则;

最后:

如果看到这里,你还是理解不了Handler与Thread之间的关系,没关系,建议你多百度几篇博文,静下心来慢慢琢磨,边写代码边思考,这样会有助于理解的。其实,我也是在工作之余,断断续续花了一个星期的时候去理解Handler的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: