进度条默认的最大值为100,当i为100 时  然后调用handler.removeCallbacks(run);这个方法来停止这个进程,但是在run方法中写入System.out.println("BarProgress---->"+bar.getProgress());发现这个进程并没有停止还是在继续运行,任然在输出BarProgress---->100,这是为什么啊?
代码在下面···
package com.www;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 HandlerBarActivity extends Activity {
    /** Called when the activity is first created. */
ProgressBar bar =null;
Button btn = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btn = (Button) findViewById(R.id.myBtn);
        bar = (ProgressBar) findViewById(R.id.progressBar);
        
        btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
handler.post(run);
}
});
        
    }
    
    Handler handler = new Handler(){     public void handleMessage(Message mes){
     bar.setProgress(mes.arg1);
     handler.post(run);
     }
   
    };
    
    Runnable run = new Runnable(){
       int i=0;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("BarProgress---->"+bar.getProgress());
i=i+10;
Message msg = handler.obtainMessage();
msg.arg1=i;

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

handler.sendMessage(msg);
if(100==i){
handler.removeCallbacks(run);

}
}
    
    };
}

解决方案 »

  1.   

    public final void removeCallbacks (Runnable r)
    Since: API Level 1Remove any pending posts of Runnable r that are in the message queue.这个函数的作用是把你让在消息队列里的这个runnable 对象从handler的消息队列中remove掉。并没有说要停掉这个线程
      

  2.   

    嘿嘿``` 把removeCallbacks(Runnable r)方法理解错了
      

  3.   

    你的代码明显的问题多处。Handler.post(Runnable)方法是利用消息机制让Handler执行一次Runnable的代码,其执行是在当前线程完成的。Handler的handleMessage方法是当Handler收到消息时候执行对应消息的处理代码,在你的代码里没有对消息的what参数归类处理,则所有消息都会执行下面的代码。我们再来看看你的Runnable接口,刚才说过post方法执行的Runnable是当前线程执行的,所以你的Sleep会造成UI的短时间无反应。然后你通过obtainMessage获取了一个消息,并通过sendMessage方法向消息队列添加了这个消息,并马上根据是否进度为100 removeCallbacks了Runnable,需要了解的是你用post方法来执行的Runnable并不需要你去remove,这个方法往往用在我们要取消一个回调。比如我在弹出后执行一个postDelay来定时关闭弹窗,但在用户对弹窗进行操作后,我们需要不继续原先的延时关闭,而是先remove掉后再开启一个延时,这样效果就是用户不对弹窗UI操作后规定的延时后关闭弹窗(PopupWindow)。那么为什么你的代码会一直执行呢?因为你的sendMessage是往消息队列插入了一个消息,而handleMessage方法肯定会在你的if(100==i){
                    handler.removeCallbacks(run);
    之后来执行,CPU不会直接中断你的runnable来先执行你的handleMessage,所以你的remove就没有意义了。
      

  4.   

    正确的代码如下:package com.www;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 HandlerBarActivity extends Activity {
        /** Called when the activity is first created. */
        ProgressBar bar =null;
        Button btn = null;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            btn = (Button) findViewById(R.id.myBtn);
            bar = (ProgressBar) findViewById(R.id.progressBar);
            
            btn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    handler.postDelay(run,1000);
                }
            });
            
        }
        
        Handler handler = new Handler();
        
        Runnable run = new Runnable(){
            @Override
            public void run() {
                //这里对进度条进行累加
                if(100 != bar.getProgress()){
                    handler.postDelay(run);                
                }
            }        
        };
    }
      

  5.   

     最后一句少写了一个参数,应该是handler.postDelay(run,1000);
      

  6.   

    先申明一下哈,我不是你说的那个同一个发帖人的人啦~
    还有,你说不需要我们主动去remove那个回调函数,那我最后点击BACK按键结束该进程的时候为什么那个handleMessage还是一直在执行呢?就算我在onDestroy函数里remove回调了,也结束了创建的子进程了也还是在一直抛消息和处理消息呀,这是为什么呢?
    额……我的代码:
    package com.test.handler;import android.R.integer;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.HandlerThread;
    import android.os.Looper;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ProgressBar;public class MultiThreadHandler extends Activity {
    private ProgressBar myProgressBar;
    private Button myButton; HandlerThread barThread = new HandlerThread("ChildThread");
    myHandler barHandler; /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); myProgressBar = (ProgressBar) findViewById(R.id.progressbar_id);
    myButton = (Button) findViewById(R.id.button_id); // HandlerThread barThread = new HandlerThread("myThread");
    barThread.start();
    barHandler = new myHandler(barThread.getLooper());
    // myHandler barHandler = new myHandler(barThread.getLooper());
    myProgressBar.setProgress(10);
    Log.i("TAG", "onCreate ---> " + Thread.currentThread().getName()); Message msg = barHandler.obtainMessage();
    msg.arg1 = 0;
    msg.sendToTarget();
    myButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    myProgressBar.setProgress(70);
    Log.i("TAG", "Click the Button...");
    Message msg = barHandler.obtainMessage();
    msg.arg1 = 80;
    msg.sendToTarget();
     barHandler.post(barThread);
    // myProgressBar.setProgress(60); }
    });
    } @Override
    protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    barHandler.removeCallbacks(barThread);
    barThread.stop();
    } class myHandler extends Handler {
    public myHandler() { } public myHandler(Looper myLooper) {
    super(myLooper);
    } @Override
    public void handleMessage(Message msg) {
    // TODO Auto-generated method stub
    super.handleMessage(msg);
    int ms = msg.arg1;
    Log.i("TAG", "handlerMessage ---> "
    + Thread.currentThread().getName());
    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    myProgressBar.setProgress(50);// //////////////////////////////////////
    Log.i("TAG", "The message here is " + ms);
     Message msg1 = barHandler.obtainMessage();
     if (msg1.arg1 < 100) {
     msg1.arg1 = msg1.arg1 + 10;
     msg1.sendToTarget();
    // barHandler.post(barThread);
     }
    }
    }
    }