您的位置:首页 > 其它

关于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对象了,不会出现竞争状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: