前言
本文是对之前实现的UBT中缓存事件的优化。
之前的UBT上报实现
HandlerThread
本质是个Thread,内部封装了一个Looper
,方便在子线程中使用Handler进行消息处理。
使用方式和线程一致,必须要调用start()
开启一个线程。
//源码
public class HandlerThread extends Thread {
//...
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
//...
}
//调用
HandlerThread handlerThread = new HandlerThread();
handlerThread.start();
适用场景
需要开启一个子线程去处理某些事件,但是事件产生时间不确定,例如缓存UBT产生的事件。如不使用HandlerThread,就必须通过定时轮询的方式去获取是否有新的事件产生。
代码实现
public class UBTSaver {
private HandlerThread handlerThread;
private Handler mHandler;
public UBTSaver() {
}
private void handleEvent(UBTReqeustEventModel event) {
//处理无效session
if (TextUtils.isEmpty(event.getSessionId())) {
refreshSession(event);
}
//保存事件到数据库
UBTEventDBManager.getInstance().insert(event);
LogUtils.d(DRUBT.LOG_TAG + "保存成功一条数据,eventId:"+event.getEvent().getEventId());
}
private void refreshSession(final UBTReqeustEventModel event) {
//TODO 刷新session
}
//关闭线程
public void shutDown() {
mHandler.removeCallbacksAndMessages(null);
handlerThread.quit();
}
public void enqueueEvent(UBTReqeustEventModel event) {
Message message = Message.obtain();
message.obj = event;
mHandler.sendMessage(message);
}
public void start() {
handlerThread = new HandlerThread("UBTSaver");
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
UBTReqeustEventModel event = (UBTReqeustEventModel) msg.obj;
handleEvent(event);
}
};
}
}