上一篇分析了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();
}
}
未完待续.....