Handler不执行handleMessage方法

Nikita90 发布于 2014/02/27 19:33
阅读 1K+
收藏 0


public class BounceActivity extends Activity {
    protected static final int GUIUPDATEIDENTIFIER = 0x101;
    BounceView bounceView = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        this.bounceView = new BounceView(this);
        this.setContentView(this.bounceView);
        handler.post(r);
    }


    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
   System.out.println("handle message");
            switch (msg.what){
                case BounceActivity.GUIUPDATEIDENTIFIER:
                    bounceView.invalidate();
                    break;
            }
            super.handleMessage(msg);
        }
    };


    Runnable r = new Runnable() {
        @Override
        public void run() {
            while(!Thread.currentThread().isInterrupted()){
System.out.println("thread running");
                Message msg = handler.obtainMessage();
                msg.what = BounceActivity.GUIUPDATEIDENTIFIER;
                handler.sendMessage(msg);
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    };
}

执行结果:每隔3s就打印一次thread running

疑问:在主线程中handler将r线程对象添加到消息队列,执行r线程时,handler.sendMessage(msg)向handler发送消息,为什么不执行handler的handleMessage()方法呢?

请大家多多指教,谢谢!














































加载中
0
117
117
看源代码, handleMessage 是放在callback接口中的,只有开启线程的时候,找个接口才被调用。所以,不开新线程,handleMessage 是不会被调用的。
Nikita90
Nikita90
弄明白为什么了。去掉while()就可以了
0
Nikita90
Nikita90
因为handler在主线程中,handler.post(r)并不是单独开启一个新的线程,而是调用线程r对象run()方法,在run()方法里一直循环执行代码,所以只有run()方法执行完毕,handler才会执行handleMessage()方法来接收消息。
0
117
117
Cara90说的才是对的,我的错鸟。。。
返回顶部
顶部