初学Android,请教handler.removeCallbacks的问题

程序员一一涤生 2011-11-16 08:06:31
代码:
//声明一个Handler对象
private Handler handler = new Handler(){

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
progressBar.setProgress(msg.arg1);
handler.post(updateThread);//立即执行updateThread线程进入run()方法
}

};
//匿名内部类方式定义一个线程
private Runnable updateThread = new Runnable(){
int i = 0;
@Override
public void run() {
System.out.println("UpdateThread");
i+=10;
//progressBar.setProgress(i);//设置当前进度条位置
//progressBar.setSecondaryProgress(i+10);//设置当前第二进度条位置
//得到消息对象,Message类由Android操作系统提供
Message msg = handler.obtainMessage();
msg.arg1 = i;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//将消息压入消息队列,handlerMessage(Message msg)方法被异步调用
handler.sendMessage(msg);
if(i==100){
i=80;//这里重新给i赋值后(i<90)线程就不会终止,为什么? //progressBar.setVisibility(View.GONE);//隐藏进度条
handler.removeCallbacks(updateThread);//从队列中移除updateThread线程
}
//延迟1秒将updateThread线程加入线程队列去执行一次updateThread线程
//handler.postDelayed(updateThread, 1000);
}

};
...全文
871 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a445756552 2012-05-14
  • 打赏
  • 举报
回复
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
progressBar.setProgress(msg.arg1);
handler.post(updateThread);//立即执行updateThread线程进入run()方法
}
这个方法要改下你自己注释都说了,是立即执行线程的run方法,所以,不管你run里面怎么判断,它都会调你的run方法,所以改成
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
progressBar.setProgress(msg.arg1);
if(msg.arg1 >= progressBar.getMax()) {
handler.removeCallbacks(updateThread);
} else {
handler.post(updateThread);//立即执行updateThread线程进入run()方法
}
}
franzhong 2011-11-17
  • 打赏
  • 举报
回复
你把i的值输出来看,就明白了
libai 2011-11-17
  • 打赏
  • 举报
回复
是看的mar代码吧,那上面的初学可以,但是要学精了,你就会发现很多问题了.这个我当时也注意到了,是不会停的,关键是那个handler messag有个Thread.post的函数重调了这个线程

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧