removeCallbacks()方法无法结束Handler创建的线程
解决方案 »
- 请问如何让android对话框顶置
- 求助 gallery改更imgaeadapter出错
- 求解:android 连续播放四种动画效果--在线等
- 怎么保证BitmapFactory.decodeStream()能一次完整下载数据?
- 关于ListView的selector问题
- 在模拟器上可以显示的图片为什么在手机上就显示不了?
- Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
- 没有Activity的程序,如何开机启服务?
- android的牛人们
- 开发的android 应用安装视上,电视连接鼠标,鼠标点击app,不起作用,如何处理。
- 求助:Android开发案例--好友录,献上30分,100%结贴
- main.xml导致eclipse自动关闭
可以结束的
相对来说Handler线程,问题,不是很大。如果,从这个调度考虑。我觉得,还是让系统自己去管理的好。
如果你要刻意的去关闭它,那就找LS说的,试试看。
public void handleMessage(Message msg) {
ProgressBar.setProgress(msg.arg1);
Handler.post(updateThread);
}
//run方法
public void run() {
System.out.println("Begin Thread");
i = i + 10 ;
//得到一个消息对象,Message类是有Android操作系统提供
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
msg.arg1 = i ;
try {
//设置当前显示睡眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将msg对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
}但是当i加到100以上都还没停止,还有线程在运行
我想handler是不是会不断的创建线程装入到队列中的呢?
呵呵,要是行,给我也看看啊。
miCount++;
miCount>10;
不动了。或者直接finish();
你试试看。
求解!!!
根据我的观察,应该是removeCallbacks把线程移出消息队列
但是线程还没有结束 还在继续运行
在
f( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
里加上 return; 应该就行了,这样:f( i == 100){
updateBarHandler.removeCallbacks(updateThread);
return;
}
我的思路: 设置一个if()语句来作为结束线程的条件,比如说if(msg.arg1 == 200)
然后需要循环结束的时候,把msg的值设置成200发送给线程,这样是不是就可以结束线程了?我自己的试验结果失败,我把msg设为类的成员变量,然后在把结束线程的条件msg值发给线程
结果虚拟机报错-___________________- 不知道是我的思路错了,还是我执行思路的方法错了?
设置一个结束标志 boolean flag = true;.... Thread ...{
public void run()
{
while(flag){
//do some thing
}
}
在stop()方法废弃的情况下,这是比较稳妥的方法之一.
hander.removeCallbacks()方法是结束线程而不是死循环
if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
语句放到
public void handleMessage(Message msg) {
ProgressBar.setProgress(msg.arg1);
Handler.post(updateThread);
}
就好了,因为sendmessage后虽然判断结束了线程,但在handlemessage方法中重新启用线程了。
private myRunnable runnable = new myRunnable();
private Handler myHandler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.arg1 > 100){
myHandler.removeCallbacks(runnable);
}
else{
progressBar.setProgress(msg.arg1);
myHandler.post(runnable);
System.out.println(msg.arg1);
}
}
}; class myRunnable implements Runnable{
int i = 0;
public void run() {
// TODO Auto-generated method stub
i = i + 10;
Message message = myHandler.obtainMessage();
message.arg1 = i;
try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
myHandler.sendMessage(message);
}
}
thread.start();
Handler r=new Handler(thread.getLooper());
r.postDelayed(new java.lang.Runnable(){
public void run() {
……
}}, 1000);
这个线程只执行一回……