读书人

一个简单的handler的进程停止有关问题

发布时间: 2012-02-08 19:52:21 作者: rapoo

一个简单的handler的进程停止问题,望高手帮帮小弟···
进度条默认的最大值为100,当i为100 时 然后调用handler.removeCallbacks(run);这个方法来停止这个进程,但是在run方法中写入System.out.println("BarProgress---->"+bar.getProgress());发现这个进程并没有停止还是在继续运行,任然在输出BarProgress---->100,这是为什么啊?
代码在下面···


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




[解决办法]
public final void removeCallbacks (Runnable r)
Since: API Level 1

Remove any pending posts of Runnable r that are in the message queue.

这个函数的作用是把你让在消息队列里的这个runnable 对象从handler的消息队列中remove掉。并没有说要停掉这个线程

[解决办法]
退出线程就把握。
[解决办法]
你的代码明显的问题多处。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就没有意义了。
[解决办法]
最后一句少写了一个参数,应该是handler.postDelay(run,1000);

[解决办法]
探讨
你的代码明显的问题多处。Handler.post(Runnable)方法是利用消息机制让Handler执行一次Runnable的代码,其执行是在当前线程完成的。Handler的handleMessage方法是当Handler收到消息时候执行对应消息的处理代码,在你的代码里没有对消息的what参数归类处理,则所有消息都会执行下面的代码。我们再来看看你的Runnable接口,刚才说过post方法执行的……


读书人网 >Android

热点推荐