这是一个网上找的例子,讲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); 但是线程并未停止
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); 但是线程并未停止
解决方案 »
- bat脚本问题
- android编译apk
- Android控件对齐求助(急!!!)
- 在eclipse里无法进行最后的SDK设置。
- dalvik虚拟机中android怎么联网?
- android opengl程序同样的顶点坐标及纹理坐标,同样大小的bmp与png纹理,png显示正常但bmp左右对角交换了。
- 做个公交查询软件,但WebView为什么打不开百度地图,各位大牛帮帮小弟,setJavaScriptEnabled(true)也写了。从别的浏览器可以正常访问。
- 像微信朋友圈,点评论时弹出一个“赞和评论”的框,要怎么做
- 按下home键后回到app后新生成了activity解决
- 请问安卓中的AndroidManifext.xml文件问题
- 新人求指导-android开发学习之路
- android下JNI调用c++游戏代码,求高手解惑。
int i = 0;
这一句删除,然后在private Button startbutton;后面加上一句
private int i=0;
试试
问题是在updateBarHandler.removeCallbacks(updateThread);
removeCallbacks,是移除pending的thread.也就是正在执行的,是不能停止并且移除的。
所以你的线程就停止不了。
在你这儿我看了下,你的线程无法停下来主要原因是你的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的使用!