通过HandlerThread优化UBT缓存流程

前言

本文是对之前实现的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);
            }
        };
    }
}

你可能感兴趣的:(通过HandlerThread优化UBT缓存流程)