这是一个网上找的例子,讲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); 但是线程并未停止
解决方案 »
- android客户端怎么把图片post给php服务端?
- 如何做出淘宝中搜索宝贝之后显示搜索结果的效果?
- menu的透明度问题
- 界面是否处在当前APP?
- android Opengl es 怎么绘制圆锥
- 今天才学写一个计算机程序,崩溃了,Unfortunately,Activity01 has stopped
- 如果不用真手机来调试,怎样的硬件配置才能达到流畅啊?
- 关于android BLE 从模式(peripheral role)-android L
- 关于android获取视频缩略图的问题,大神进来
- Android WebView为什么没有内存泄漏了
- 新人求指导-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的使用!