removeCallbacks()方法无法结束Handler创建的线程

解决方案 »

  1.   

    handler.removeCallbacks();
    可以结束的
      

  2.   

    觉得,没有这个必要。本来就是采用的生命周期。那些活动都没有彻底释放内存。认识等待系统进行管理,这点,也是人为无法控制的。
    相对来说Handler线程,问题,不是很大。如果,从这个调度考虑。我觉得,还是让系统自己去管理的好。
    如果你要刻意的去关闭它,那就找LS说的,试试看。
      

  3.   

    我在//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是不是会不断的创建线程装入到队列中的呢?
      

  4.   

     你的意思是说,你的程序要是运行了,就停不下来,一直在那运行是吧我有个想法,你试试,要是可以的话,把你的这个程序放上来,让我也试试。设置个循环LOOP。给个if,或者while去做判断。
    呵呵,要是行,给我也看看啊。
      

  5.   

    miCount=0,
    miCount++;
    miCount>10;
    不动了。或者直接finish();
    你试试看。
      

  6.   

    我在Hander的另外一个线程中写一个死循环,在程序运行过程中 已经用过了hander.removeCallbacks()方法 可以死循环并没有结束 ,还在继续,
    求解!!!
      

  7.   

    不用死循环啊,你可以在另外一个里面也使用sendMessage来回调啊
      

  8.   


    根据我的观察,应该是removeCallbacks把线程移出消息队列
    但是线程还没有结束 还在继续运行

    f( i == 100){
                    updateBarHandler.removeCallbacks(updateThread);
                }
    里加上 return; 应该就行了,这样:f( i == 100){
                    updateBarHandler.removeCallbacks(updateThread);
                    return;
                }
      

  9.   


    我的思路: 设置一个if()语句来作为结束线程的条件,比如说if(msg.arg1 == 200)
    然后需要循环结束的时候,把msg的值设置成200发送给线程,这样是不是就可以结束线程了?我自己的试验结果失败,我把msg设为类的成员变量,然后在把结束线程的条件msg值发给线程
    结果虚拟机报错-___________________- 不知道是我的思路错了,还是我执行思路的方法错了?
      

  10.   

    呵呵,停止线程,虽然早期有stop函数,但是后来给废弃了. 所以你现在的办法只有用结束标志.
    设置一个结束标志 boolean flag = true;.... Thread ...{
      public void run()
     {
       while(flag){
         //do some thing 
       }
     }
      

  11.   

    thread开启不好停掉,内部设置标记可以让其停止,不过遇到线程死锁你还是要在代码层上尽量返回,比如用轮训方式处理状态机
      

  12.   

    貌似你说的是线程的问题,跟HANDLER没什么太大关系
      

  13.   

    确实,貌似,一个线程开起来了,在android框架下,好像没有更好的方法说去很好的结束掉该进程。
      

  14.   

    直接把这个线程的引用变量置为NULL,交给GC去回收就可以了.
    在stop()方法废弃的情况下,这是比较稳妥的方法之一.
      

  15.   

    直接用一个标识去让死循环结束不就行了。
    hander.removeCallbacks()方法是结束线程而不是死循环
      

  16.   

    将 
    if( i == 100){
                    updateBarHandler.removeCallbacks(updateThread);
                }
    语句放到
    public void handleMessage(Message msg) {
                ProgressBar.setProgress(msg.arg1);
                Handler.post(updateThread);
            }
    就好了,因为sendmessage后虽然判断结束了线程,但在handlemessage方法中重新启用线程了。
      

  17.   


        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);
    }
        }
      

  18.   

    HandlerThread thread=new HandlerThread("netthread");
    thread.start();
    Handler r=new Handler(thread.getLooper());
    r.postDelayed(new java.lang.Runnable(){
        public void run() {
    ……
        }}, 1000);
    这个线程只执行一回……