关于Handler和Looper

一)Handler的定义

 Handler mHandler = new Handler() {

        @Override

        public void handleMessage(Message message) {
            switch (message.what) {
                case MESSAGE_SPEAK:
                    String utterance = (String) message.obj;
                    mTts.speak(utterance, QUEUING_MODE_INTERRUPT, null);
                    return;

...
            }

 Handler mHandler = new Handler();

二)Handler的使用

基本可以分为两种,一种是各种形式的SendMessage,一种是各种形式的post(详情可参考API)。

1)SendMessage可以用来在线程间发生消息:

mHandler.sendEmptyMessage(MESSAGE_SHUTDOWN_TTS);

或 mHandler.sendMessage(mHandler.obtainMessage(0x120,110,119,"\"Test Message Content!\""));

mHandler.obtainMessage(MESSAGE_PLAY_EARCON, INDEX_RINGER_SILENT, 0).sendToTarget();等

2)post用来在UI主线程中执行Runnable对象:

mHandler.post(new Runnable() {

            public void run() {
...
                mWindowManager.addView(mDialogText, lp);
            }});
}

    private Runnable mForceCheckBoxRunnable = new Runnable() {

        public void run() {
            if (mCheckBoxPreference != null) {
                mCheckBoxPreference.setChecked(!mCheckBoxPreference.isChecked());
            }
            // Force toggle again in a second
            mHandler.postDelayed(this, 1000);
        }
    };
      

三)内存泄漏

Handler会因隐式持有外部类的引用而引起内存泄漏,为避免内存泄漏,在使用Handler的Activity的onPause()函数中需要调用:

 mHandler.removeMessages(MSG_FADE);(针对SendMessagepost)

或mHandler.removeCallbacks(mForceCheckBoxRunnable);(针对post)

四)Looper类

在非UI线程中使用Handler需要使用Looper类来自己维护消息队列。

     new Thread(new Runnable() {

      @Override
            public void run() {               
                    Looper.prepare();
                    Looper.loop();
                }
            }            
        }, "thread1").start();

    ...

}

其中,Looper.prepare() 用来创建消息队列,并将该Looper与线程关联。

Looper.loop()循环读取消息并将其发生给相应的Handler

另外还有几个会用到的函数:

Looper.myLooper()返回与当前线程关联的Looper对象,在调用之前必须先调用Looper.prepare(),否则返回值是null。

Looper.quit()将消息队列中阻塞的消息抛出并回收。一般在线程结束前调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值