这是一个网上找的例子,讲handlerimport 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);     但是线程并未停止

解决方案 »

  1.   

    这个线程里面没有看到循环语句,i永远不可能为100,将
    int i = 0;
    这一句删除,然后在private Button startbutton;后面加上一句
    private int i=0;
    试试
      

  2.   

    刚又看了你的代码,问题不是变量i的问题,我前面理解错误。
    问题是在updateBarHandler.removeCallbacks(updateThread);
    removeCallbacks,是移除pending的thread.也就是正在执行的,是不能停止并且移除的。
    所以你的线程就停止不了。
      

  3.   

    楼主,不知你是否清楚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");  
       //null表示移除所有消息,这两个参数可以去看文档,
      updateBarHandler.removeMessages(0, null);
      }   以上希望能帮助你更好地理解handler的使用!