美文网首页
通过HandlerThread优化UBT缓存流程

通过HandlerThread优化UBT缓存流程

作者: pphdsny | 来源:发表于2018-02-05 14:50 被阅读25次

    前言

    本文是对之前实现的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缓存流程

          本文链接:https://www.haomeiwen.com/subject/ikzbzxtx.html