Handler ThreadHandler Looper的总结
最近android学到了多线程这块,有点难以理解,在此去网上搜集了些资料,整理如下:
1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环。 与其说Handler和一个线程绑定,不如说Handler是和Looper一一对应的。
这里贴上mars老师的一段教学代码,以便理解:
public class HandlerTest2 extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//打印了当前线程的ID
System.out.println("Activity-->" + Thread.currentThread().getId());
//生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供
HandlerThread handlerThread = new HandlerThread("handler_thread");
//在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
handlerThread.start();
//new一个handler来承载Looper,正如上文所说,一个handler和一个Looper是一一对应的
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
//将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象
msg.sendToTarget();
}
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
//调用父类的构造方法,也就是Handler类的构造方法
super(looper);
}
public void handleMessage(Message msg) {
System.out.println("Handler--->" + Thread.currentThread().getId());
System.out.println("handlerMessage");
}
}
}
2.调用handler的post方法添加线程,调用的是线程的run方法,而不是start方法,此时handler和被调用的线程仍然处于同一线程之中。
如果要实现多线程, 必须按照上一条所写的那样,让handler与每一个looper一一对应,即与一个线程一一对应。
最后附上博文一篇:http://blog.csdn.net/wanglong0537/archive/2011/04/06/6304239.aspx
Handler ThreadHandler Looper的内容并不是到此为止,这只是最基本的理解,以后随着学习的深入,我会再次总结。
更多相关文章
- 主线程中的Looper.loop()一直无限循环为什么不会造成ANR?
- android中的通信机制总结
- Android中activity和xml的第一个项目
- android下jni开发总结
- Binder驱动之设备初始化
- Android应用程序资源——menu菜单资源
- 【Android架构师java原理专题详解】一;泛型原理详解
- Android常见面试题&字节跳动、阿里、腾讯2019实习生Android岗部
- Android(安卓)限制textview Edittext 只能输入电话号码和特定字