关于android Handler进行线程处理消息队列与线程队列线程无法停止的问题

本文详细解析了 Android 中 Handler 的工作原理,特别是消息队列与线程队列的区别,并提供了两种停止无限循环线程的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看到一个问题,代码如下:

public class HandlerTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
updateBarHandler.post(updateThread);  
}
}
//使用匿名内部类来复写Handler当中的handlerMessage()方法  
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
System.out.println("arg1的值:"+msg.arg1);  
  updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中  
}
};
//线程类,该类使用匿名内部类的方式进行声明  
  Runnable updateThread = new Runnable(){  
  int i = 0;  
  public void run() {  
  // TODO Auto-generated method stub  
  System.out.println("Begin Thread");  
  i+=10;  
  //得到一个消息对象,Message类是android系统提供的  
  Message msg = updateBarHandler.obtainMessage();  
  //将Message对象的arg1参数的值设置为i  
  msg.arg1 = i; //用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少  
  try{  
  Thread.sleep(1000); //让当前线程休眠1000毫秒  
  }catch(InterruptedException ex){  
  ex.printStackTrace();  
  }  
  //将Message对象加入到消息队列当中  
  updateBarHandler.sendMessage(msg);  
  //如果i的值等于100  
  if (i == 100){  
  //将线程对象从队列中移除  
  System.out.println("End Thread");  
  updateBarHandler.removeCallbacks(updateThread);
  }  
  }  
  };  


}

疑问:

最后如果i=100,使用了updateBarHandler.removeCallbacks(updateThread); 但是线程并未停止

这是为何?

针对以上问题,解答如下:


对于Handler应该是比较常见的问题了,但是发现还有许多的朋友不是很了解,故而这里再罗嗦一次咯


首先,相信还是有人不清楚android handler的队列问题!这里处理的队列问题,其实这儿有两个队列,一个是消息队列,另外一个是线程队列(也可以看成是runnable队列了)在上面这段代码我看了下,它的线程无法停下来主要原因是它的sendMessage是写在if(i == 100 )之前,而它在if语句中调用的是removeCallbacks这个方法取消的是线程队列中的runnable,却无法取消消息队列中的Message,当消息发送给handler处理的时候,在handlMessage里面又post到线程队列,线程又开始运行,所以线程便一直重复运行无法停下来了。。。

解决方法1:

你会发现我们需要移除的仅仅是消息队列而不是线程队列,那么更改如下
  //将Message对象加入到消息队列当中  
  updateBarHandler.sendMessage(msg);  
  //如果i的值等于100  
  if (i == 100){  
  //将消息对象从消息队列中移除  
  System.out.println("End Thread");  
  //null表示移除所有消息,这两个参数可以去看文档,
  updateBarHandler.removeMessages(0, null);
  }  

解决办法2:  
  //如果i的值等于100  
  if (i == 100){  
  System.out.println("End Thread");  
  return;
  }  
  //将Message对象加入到消息队列当中  
  updateBarHandler.sendMessage(msg);  

也许你要问为什么没有remove了,因为此时两个队列中均没有需要我们移除的任何对象!


以上希望能帮助你更好地理解handler的使用!如有疑问请留言讨论!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值