在使用handler和message时,可以参考这两篇文章和文章,有两点需要记住:
1 每个线程只能有一个looper
2 主线程默认有looper
在向主线程的looper发送消息时,可以在多线程中采用如下方法,其中Message携带了一个Bundle的data,可以传递参数等:
while(playStatus){
try {
//绑定成功才能开始更新UI
if(mBound){
//发送消息,要求更新UI
Message msg = new Message();
data.clear();
progress = mService.getProgress();
msg.what = 0;
data.putDouble("progress", progress);
msg.setData(data);
mHandler.sendMessage(msg);
}
Thread.sleep(milliseconds);
//Thread.currentThread().sleep(milliseconds);
//每隔100ms更新一次UI
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但是看了第二篇参考才知道,
获得Message的构造方法最好的方式是调用Message.obtain() 和 Handler.obtainMessage()方法。
具体的可以看一下obtain()的源码,学渣就不说了。
还有在实际的编码中,学渣遇到了如下问题:
<pre name="code" class="java"> public class MyThread implements Runnable{
//用来向UI线程传递进度的值
Bundle data = new Bundle();
//更新UI间隔时间
int milliseconds = 100;
double progress;
//Message 没有每次都new,而是想使用同一个对象,出错
Message msg = new Message();
@Override
public void run() {
// TODO Auto-generated method stub
//用来标识是否还在播放状态,用来控制线程退出
while(playStatus){
try {
//绑定成功才能开始更新UI
if(mBound){
//发送消息,要求更新UI
data.clear();
progress = mService.getProgress();
msg.what = 0;
data.putDouble("progress", progress);
msg.setData(data);
mHandler.sendMessage(msg);
}
Thread.sleep(milliseconds);
//Thread.currentThread().sleep(milliseconds);
//每隔100ms更新一次UI
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
在上述代码中Messag没有使用new或者obtain(),而是使用同一个Message对象,结果出错,不知道为什么,难道是MessageQueue在取Message后会销毁这个Message对象么,求指导。。。