我是靠谱客的博主 激情糖豆,最近开发中收集的这篇文章主要介绍关于android Handler进行线程处理消息队列与线程队列线程无法停止的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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的使用!如有疑问请留言讨论!



最后

以上就是激情糖豆为你收集整理的关于android Handler进行线程处理消息队列与线程队列线程无法停止的问题的全部内容,希望文章能够帮你解决关于android Handler进行线程处理消息队列与线程队列线程无法停止的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部