/使用匿名内部类来复写Handler当中的handlerMessage()方法,布布扣,bubuko.com
/使用匿名内部类来复写Handler当中的handlerMessage()方法
原文:http://www.cnblogs.com/tfy1332/p/3653588.html
当i==100时,执行了下面几行代码
if (i == 100){
//将线程对象从队列中移除
updateBarHandler.removeCallbacks(updateThread);
}
看似updateThread线程从线程对象队列中移除,不会再执行了,但是执行这几行代码前执行了下面代码
//将Message对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
这会导致下面的代码被执行
public void handleMessage(Message msg) {
progressBar.setProgress(msg.arg1);
updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
}
updateThread线程又加到线程对象队列中,updateThread线程永远不会从线程对象队列中移除,updateThread的run方法不断的执行,这就导致了死循环。
解决方案:
将 updateThread的run方法里的
if (i == 100){
//将线程对象从队列中移除
updateBarHandler.removeCallbacks(updateThread);
}
这几行代码移到updateBarHandler的handleMessage方法里,修改如下:
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
progressBar.setProgress(msg.arg1);
if(msg.arg1==100){
updateBarHandler.removeCallbacks(updateThread);
}else{
updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
}
}
};
我是通过调试查看代码的执行顺序,发现这个问题的