当前位置: 代码迷 >> Android >> 怎么停止线程
  详细解决方案

怎么停止线程

热度:31   发布时间:2016-05-01 17:49:51.0
如何停止线程
这是一个网上找的例子,讲handler

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class HandlerTest extends Activity {
private ProgressBar progressbar;
private Button startbutton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.aa);
progressbar=(ProgressBar)findViewById(R.id.progressBar);
startbutton=(Button)findViewById(R.id.StartButton1);
startbutton.setOnClickListener(new startbuttonOnclickListener());
}
class startbuttonOnclickListener implements OnClickListener{

public void onClick(View v) {
progressbar.setVisibility(View.VISIBLE);
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);
  }  
  }  
  };  


}

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

------解决方案--------------------
这个线程里面没有看到循环语句,i永远不可能为100,


int i = 0;
这一句删除,然后在private Button startbutton;后面加上一句
private int i=0;
试试
------解决方案--------------------
你的i是一个局部的变量,每次都是从0开始的,所以。。。。
------解决方案--------------------
楼主,不知你是否清楚android handler这里处理的队列问题,其实这儿有两个队列,一个是消息队列,另外一个是线程队列(也可以看成是runable队列了)
在你这儿我看了下,你的线程无法停下来主要原因是你的sendMessage是写在if(i == 100 )之前,而你在if语句中调用的是removeCallbacks这个方法取消的是线程队列中的runable,却无法取消你消息队列中的message,所以线程便一直运行无法停下来了。。。
解决办法1:
//如果i的值等于100
if (i == 100){
System.out.println("End Thread");
return;
}
//将Message对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
也许你要问为什么没有remove了,因为此时两个队列中均没有需要我们移除的!
解决2:你会发现我们需要移除的仅仅是消息队列而不是线程队列,那么更改如下
//将Message对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
//如果i的值等于100
if (i == 100){
//将消息对象从消息队列中移除
System.out.println("End Thread");
  相关解决方案