这是一个网上找的例子,讲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");