请问如何结束Handler的线程 removeCallbacks()方法无法结束Handler创建的线程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 handler.removeCallbacks();可以结束的 觉得,没有这个必要。本来就是采用的生命周期。那些活动都没有彻底释放内存。认识等待系统进行管理,这点,也是人为无法控制的。相对来说Handler线程,问题,不是很大。如果,从这个调度考虑。我觉得,还是让系统自己去管理的好。如果你要刻意的去关闭它,那就找LS说的,试试看。 我在//handleMessage方法public void handleMessage(Message msg) { ProgressBar.setProgress(msg.arg1); Handler.post(updateThread); }//run方法public void run() { System.out.println("Begin Thread"); i = i + 10 ; //得到一个消息对象,Message类是有Android操作系统提供 Message msg = updateBarHandler.obtainMessage(); //将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少 msg.arg1 = i ; try { //设置当前显示睡眠1秒 Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //将msg对象加入到消息队列当中 updateBarHandler.sendMessage(msg); if( i == 100){ updateBarHandler.removeCallbacks(updateThread); } }但是当i加到100以上都还没停止,还有线程在运行我想handler是不是会不断的创建线程装入到队列中的呢? 你的意思是说,你的程序要是运行了,就停不下来,一直在那运行是吧我有个想法,你试试,要是可以的话,把你的这个程序放上来,让我也试试。设置个循环LOOP。给个if,或者while去做判断。呵呵,要是行,给我也看看啊。 miCount=0,miCount++;miCount>10;不动了。或者直接finish();你试试看。 我在Hander的另外一个线程中写一个死循环,在程序运行过程中 已经用过了hander.removeCallbacks()方法 可以死循环并没有结束 ,还在继续,求解!!! 不用死循环啊,你可以在另外一个里面也使用sendMessage来回调啊 根据我的观察,应该是removeCallbacks把线程移出消息队列但是线程还没有结束 还在继续运行在f( i == 100){ updateBarHandler.removeCallbacks(updateThread); }里加上 return; 应该就行了,这样:f( i == 100){ updateBarHandler.removeCallbacks(updateThread); return; } 我的思路: 设置一个if()语句来作为结束线程的条件,比如说if(msg.arg1 == 200)然后需要循环结束的时候,把msg的值设置成200发送给线程,这样是不是就可以结束线程了?我自己的试验结果失败,我把msg设为类的成员变量,然后在把结束线程的条件msg值发给线程结果虚拟机报错-___________________- 不知道是我的思路错了,还是我执行思路的方法错了? 呵呵,停止线程,虽然早期有stop函数,但是后来给废弃了. 所以你现在的办法只有用结束标志.设置一个结束标志 boolean flag = true;.... Thread ...{ public void run() { while(flag){ //do some thing } } thread开启不好停掉,内部设置标记可以让其停止,不过遇到线程死锁你还是要在代码层上尽量返回,比如用轮训方式处理状态机 貌似你说的是线程的问题,跟HANDLER没什么太大关系 确实,貌似,一个线程开起来了,在android框架下,好像没有更好的方法说去很好的结束掉该进程。 直接把这个线程的引用变量置为NULL,交给GC去回收就可以了.在stop()方法废弃的情况下,这是比较稳妥的方法之一. 直接用一个标识去让死循环结束不就行了。hander.removeCallbacks()方法是结束线程而不是死循环 将 if( i == 100){ updateBarHandler.removeCallbacks(updateThread); }语句放到public void handleMessage(Message msg) { ProgressBar.setProgress(msg.arg1); Handler.post(updateThread); }就好了,因为sendmessage后虽然判断结束了线程,但在handlemessage方法中重新启用线程了。 private myRunnable runnable = new myRunnable(); private Handler myHandler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); if (msg.arg1 > 100){ myHandler.removeCallbacks(runnable); } else{ progressBar.setProgress(msg.arg1); myHandler.post(runnable); System.out.println(msg.arg1); } } }; class myRunnable implements Runnable{ int i = 0; public void run() { // TODO Auto-generated method stub i = i + 10; Message message = myHandler.obtainMessage(); message.arg1 = i; try{ Thread.sleep(1000); } catch(InterruptedException e){ e.printStackTrace(); } myHandler.sendMessage(message); } } HandlerThread thread=new HandlerThread("netthread"); thread.start(); Handler r=new Handler(thread.getLooper()); r.postDelayed(new java.lang.Runnable(){ public void run() { …… }}, 1000);这个线程只执行一回…… 为什么我昨天还能启动虚拟机,今天就不行了 三个图 滑动轮换效果,在线等 高手,请问这是什么控件 一般AP中的back键是怎么被监听到的? android.content.res.Resources$Not Fragment中setAdapter() ListView报空指针,几天没解决,求大神!!! 讨论一下,android4.0之后的网络连接问题 找个制作自定义控件的第三方库 android 2G手机网络无法访问webservice服务器问题 双级联动的一个图片展示 求助:Android开发案例--好友录,献上30分,100%结贴 main.xml导致eclipse自动关闭
可以结束的
相对来说Handler线程,问题,不是很大。如果,从这个调度考虑。我觉得,还是让系统自己去管理的好。
如果你要刻意的去关闭它,那就找LS说的,试试看。
public void handleMessage(Message msg) {
ProgressBar.setProgress(msg.arg1);
Handler.post(updateThread);
}
//run方法
public void run() {
System.out.println("Begin Thread");
i = i + 10 ;
//得到一个消息对象,Message类是有Android操作系统提供
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
msg.arg1 = i ;
try {
//设置当前显示睡眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将msg对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
}但是当i加到100以上都还没停止,还有线程在运行
我想handler是不是会不断的创建线程装入到队列中的呢?
呵呵,要是行,给我也看看啊。
miCount++;
miCount>10;
不动了。或者直接finish();
你试试看。
求解!!!
根据我的观察,应该是removeCallbacks把线程移出消息队列
但是线程还没有结束 还在继续运行
在
f( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
里加上 return; 应该就行了,这样:f( i == 100){
updateBarHandler.removeCallbacks(updateThread);
return;
}
我的思路: 设置一个if()语句来作为结束线程的条件,比如说if(msg.arg1 == 200)
然后需要循环结束的时候,把msg的值设置成200发送给线程,这样是不是就可以结束线程了?我自己的试验结果失败,我把msg设为类的成员变量,然后在把结束线程的条件msg值发给线程
结果虚拟机报错-___________________- 不知道是我的思路错了,还是我执行思路的方法错了?
设置一个结束标志 boolean flag = true;.... Thread ...{
public void run()
{
while(flag){
//do some thing
}
}
在stop()方法废弃的情况下,这是比较稳妥的方法之一.
hander.removeCallbacks()方法是结束线程而不是死循环
if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
语句放到
public void handleMessage(Message msg) {
ProgressBar.setProgress(msg.arg1);
Handler.post(updateThread);
}
就好了,因为sendmessage后虽然判断结束了线程,但在handlemessage方法中重新启用线程了。
private myRunnable runnable = new myRunnable();
private Handler myHandler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.arg1 > 100){
myHandler.removeCallbacks(runnable);
}
else{
progressBar.setProgress(msg.arg1);
myHandler.post(runnable);
System.out.println(msg.arg1);
}
}
}; class myRunnable implements Runnable{
int i = 0;
public void run() {
// TODO Auto-generated method stub
i = i + 10;
Message message = myHandler.obtainMessage();
message.arg1 = i;
try{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
myHandler.sendMessage(message);
}
}
thread.start();
Handler r=new Handler(thread.getLooper());
r.postDelayed(new java.lang.Runnable(){
public void run() {
……
}}, 1000);
这个线程只执行一回……