HandlerThread解析

本文已同步发表到我的微信公众号,扫一扫文章底部的二维码或在微信搜索 “程序员驿站”即可关注,每天都会更新优质技术文章。

上一篇分析了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();
    }
}

未完待续.....

关注我的技术公众号"程序员驿站",每天都有优质技术文章推送,微信扫一扫下方二维码即可关注:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值