关于HandlerThread类的学习心得
2016-03-16 21:38
281 查看
http://blog.csdn.net/qq_27258799/article/details/50854175
这篇帖子讲过Looper、Handler之间的关系,也说过Looper的加入,可以是一个线程升级为Looper线程,可以持续接收消息并执行一些事务,比如可以用来做图库,显示手机照片。
Looper线程的升级,使用方法大概是这样:public class MyThread extends Thread{
private static final String TAG = "MyThread";
private Handler mHandler;
public MyThread(String name){
super(name);
}
public Handler getHandler(){
return mHandler;
}
@Override
public void run(){
Looper.prepare;//把Looper绑定到此线程
mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
switch(msg.what){
//处理消息
}
}
};
Looper.loop();//不要忘了调用loop()启动消息循环
//只有循环停止了,Looper才会返回
}
}到此为止,一个Looper线程就诞生了,然后我们就可以发送Runnable对象或者消息,开始任务了。
MyThread thread = new MyThread("looper thread");
thread.start();
//过一会儿
Handler handler = thread.getHandler();
//小心:如果处理程序尚未初始化,会返回null!
//发送Runnable对象
handler.post(new Runnable(){
public void run(){
//处理一些事情
}
});
//发送消息
int what = 0;
int arg1 = 1;
int arg2 = 2;
Message msg = Message.obtain(handler, what, arg1, arg2);//还记得要用这种方法产生Message对象吧
handler.sendMessage;
值得一提的是,Handler对象在run()方法中创建,因为它需要被绑定到指定的Looper,这个Looper就是在run()方法中调用Looper.prepare()创建的。因此在线程之前,调用getHandler()将会返回null。但是问题是,尽管线程已经启动,getHandler()也可能返回null,而且上述升级Looper线程的过程略微繁琐,这个时候HandlerThread就可以派上用场了。
上述例子可以改为这样:
public class MyHandlerThread extends HandlerThread(){
private static final String TAG = "MyThread";
private Handler mHandler;
public MyThread(String name){
super(name);
}
public Handler getHandler(){
return mHandler;
}
@Override
public void start(){
super.start();
Looper looper = getlooper();
mHandler = new Handler(looper){
@Override
public void handleMessage(Message msg){
switch(msg.what){
//处理消息
}
}
};
}
}这种情况下,只要MyHandlerThread.start()执行以后,就可以用getHandler()获取Handler对象了,不会出现竞争状态。
这篇帖子讲过Looper、Handler之间的关系,也说过Looper的加入,可以是一个线程升级为Looper线程,可以持续接收消息并执行一些事务,比如可以用来做图库,显示手机照片。
Looper线程的升级,使用方法大概是这样:public class MyThread extends Thread{
private static final String TAG = "MyThread";
private Handler mHandler;
public MyThread(String name){
super(name);
}
public Handler getHandler(){
return mHandler;
}
@Override
public void run(){
Looper.prepare;//把Looper绑定到此线程
mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
switch(msg.what){
//处理消息
}
}
};
Looper.loop();//不要忘了调用loop()启动消息循环
//只有循环停止了,Looper才会返回
}
}到此为止,一个Looper线程就诞生了,然后我们就可以发送Runnable对象或者消息,开始任务了。
MyThread thread = new MyThread("looper thread");
thread.start();
//过一会儿
Handler handler = thread.getHandler();
//小心:如果处理程序尚未初始化,会返回null!
//发送Runnable对象
handler.post(new Runnable(){
public void run(){
//处理一些事情
}
});
//发送消息
int what = 0;
int arg1 = 1;
int arg2 = 2;
Message msg = Message.obtain(handler, what, arg1, arg2);//还记得要用这种方法产生Message对象吧
handler.sendMessage;
值得一提的是,Handler对象在run()方法中创建,因为它需要被绑定到指定的Looper,这个Looper就是在run()方法中调用Looper.prepare()创建的。因此在线程之前,调用getHandler()将会返回null。但是问题是,尽管线程已经启动,getHandler()也可能返回null,而且上述升级Looper线程的过程略微繁琐,这个时候HandlerThread就可以派上用场了。
上述例子可以改为这样:
public class MyHandlerThread extends HandlerThread(){
private static final String TAG = "MyThread";
private Handler mHandler;
public MyThread(String name){
super(name);
}
public Handler getHandler(){
return mHandler;
}
@Override
public void start(){
super.start();
Looper looper = getlooper();
mHandler = new Handler(looper){
@Override
public void handleMessage(Message msg){
switch(msg.what){
//处理消息
}
}
};
}
}这种情况下,只要MyHandlerThread.start()执行以后,就可以用getHandler()获取Handler对象了,不会出现竞争状态。
相关文章推荐
- DIY文字闪动效果的TextView
- Dispatcher
- 剑指offer面试题3之二维数组中的查找
- 关于label等uiview的圆角问题
- 吃螃蟹的乐趣
- Markdown语法手册
- Mac下搭建SVN服务器
- 2015年 day1.1 神奇的幻方
- 判断字符串为空
- unity3D学习笔记
- 关于finally的使用
- Android中BroadcastReceiver组件详解
- ARC中的@autoreleasepool
- 树状数组
- Yahoo Hadoop Module 8: PigTutorial
- 设计模式学习笔记——建造者模式
- 第三周实践项目二————本月有几天
- 解答Google的一道面试题
- linux ulimit 优化系统
- 【Hadoop学习】之Map-Reduce(一)