Android Handler消息机制

上一篇分析了Hanlder异步操作原理分析,没有看过的朋友可以移步看下.

Android Handler消息机制

下面介绍一个HandlerThread类。

官方介绍:

 Handy class for starting a new thread that has a looper. The looper can then be 
 used to create handler classes. Note that start() must still be called.

大致意思就是,方便去创建一个拥有looper的线程,这个looper可以用于创建Handler,且需要调用HandlerThread的start()方法完成初始化。

HandlerThread基本使用

为了讲解HandlerThread的用法,我们完成如下需求:弄一个定时器去刷新控件的颜色,运行效果如下:

点击按钮开始定时刷新控件颜色(这里设置的时间间隔是2秒钟)

Activity中的代码如下:

package com.sharejoys.interviewdemo;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class TwoActivity extends AppCompatActivity {
    private static final String TAG = TwoActivity.class.getSimpleName();
    TextView mStartBtn;
    View mColorView;

    //HandlerThread对象
    private HandlerThread mHandlerThread;
    //位于主线程中的Handler对象
    private Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
    //位于子线程中的Handler对象
    private Handler mSonThreadHandler;

    //用于标记是否正在更新
    private boolean isUpdating;
    //更新颜色时发送的msg.what值
    private static final int MSG_UPDATE_COLOR = 0x110;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
        getSupportActionBar().setTitle("HandlerThread解析");
        findViewById(R.id.startBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isUpdating = true;//启动定时器
                mSonThreadHandler.sendEmptyMessage(MSG_UPDATE_COLOR);
            }
        });
        mColorView = findViewById(R.id.color_view);


        //初始化一个子线程名字为ColorChangeThread的HandlerThread对象
        mHandlerThread = new HandlerThread("ColorChangeThread");
        //开启该子线程
        mHandlerThread.start();
        //通过mHandlerThread的Looper对象,完成子线程中的Handler初始化,
        mSonThreadHandler = new Handler(mHandlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                Log.d(TAG, "currentThread = " + Thread.currentThread().getName());
                updateViewColor();
                //这里通过isUpdating标志位模拟定时器功能,需要在onPause或者onDestroy中将标志位置为false,否则会造成严重的内存泄漏问题
                if (isUpdating) {
                    mSonThreadHandler.sendEmptyMessage(MSG_UPDATE_COLOR);
                }
            }
        };
    }

    private void updateViewColor() {
        try {
            //模拟耗时
            Thread.sleep(2000);
            mMainThreadHandler.post(new Runnable() {
                @Override
                public void run() {
                    mColorView.setBackgroundColor(Color.rgb(100, (int) (Math.random() * 255), (int) (Math.random() * 255)));
                }
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    @Override
    protected void onPause() {
        super.onPause();
        //isUpdating置为false
        isUpdating = false;
        mSonThreadHandler.removeMessages(MSG_UPDATE_COLOR);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //释放HandlerThread的资源
        mHandlerThread.quit();
    }
}
未完待续.....


猜你喜欢

转载自blog.csdn.net/tuike/article/details/79404243