handler调用handlerMessage时是在创建handler的那个线程里面运行吗?
解决方案 »
- handler怎么传数据?
- 快速心率检测软件Instant Heart Rate by Azumio 的工作原理
- android surfaceview使slidingdrawer布局显示不完整?
- 怎么让ScrollView控件一直都充满整个屏幕?
- 如果想要屏蔽掉界面的状态栏,如时间和联网状态那一栏,需要怎么改?
- Android2.2与2.3 MediaScanner的区别是什么,可否讲解一下两者的原理
- HeapWorker may be wedged 问题
- 新创建的480*854的模拟器,键盘区为啥没了?
- TabActivity布局的页签高度设置问题
- android应用添加微信分享。
- android 应用做轮流播放图片广告控件
- service启动不起来,掉不了service connection
thread.start();
looper = thread.getLooper();
handler = new PPCommandProcessHandler(looper);
那么你这个handler就是运行在PPCommandProcessThread这个线程里面,你new handler的时候没有传值,就默认为你调用的线程里面运行。
每个应用程序都有一个主线程(UI线程),一般情况下handler都是运行在主线程中,除非你自己创建了子线程。
1. 默认使用方式:
Handler mHandler = new Handler ();
这种情况下,handlerMessage()是运行在创建Handler的线程;
一般,我们都是在主线程里面创建的Handler,因此,handlerMessage()是运行在主线程里面。
如果在其它线程中创建的Handler,那handlerMessage()是运行在该线程里面。但有一个前提,该线程必须有Looper,如果没有,Handler则创建失败,会抛出RuntimeException:"Can't create handler inside thread that has not called Looper.prepare()",该Exception告诉我们,在创建Handler前,需要调用Looper.prepare();对于主线程,则不需要,因为程序在启动时,主线程(即UI线程)已调用过Looper.prepare()。
以下是一个简单的示例代码:Code 1:
Handler mInnerHandler;new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare(); // 准备Looper,否则下面创建Handler会失败
mInnerHandler= new Handler() {
public void handleMessage(android.os.Message msg) {
// Do something...
};
};
Message message = mInnerHandler.obtainMessage();
mInnerHandler.dispatchMessage(message);
Looper.loop();
}
}).start();~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Code 2:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare(); // 准备Looper,否则下面创建Handler会失败
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
2. 指定Looper来创建:
Handler mHandler = new Handler(Looper looper)
一般我们都会指定主线程的Looper。调用方式如下:
Handler mHandler = new Handler(Looper.getMainLooper())
此时,对应的handlerMessage()是运行在创建Looper对应的线程,即主线程,当然,你可以替换成你想要的任何线程;总结:如2楼所说,handlermessage 是在Looper 运行的线程中运行的。
实际上,每个Handler都会关联到一个Looper,这点通过Handler的源码就能看得到,它所绑定的Looper是处于哪个线程,那么Handler的handlerMessage、dispatchMessage最终的都是运行在对应的线程中的。