UBT上报流程

2018-01-07  本文已影响27人  pphdsny

总流程图

总流程图

流程说明:

流程解读:

事件上报流程图

事件上报流程

App端实现事件上报分为两部分,分别是事件缓存和事件上报,实现层通过两个子线程(Saver&Uploader)实现,核心代码如下:

UBTSaver.java

每秒去轮询一次,当无新消息产生的时候,会造成不必要的性能损耗。后续通过HandlerThread进行了优化。优化链接

    @Override
    public void run() {
        while (!mCloseFlag.get()) {
            UBTReqeustEventModel event = null;
            try {
                if (mVector.isEmpty()) {
                    if (!mValidVector.isEmpty()) {
                        //刷新session
                        refreshSession();
                    }
                    Thread.sleep(SLEEP_TIME);
                    continue;
                }
                event = mVector.poll();
                //处理无效session
                if (TextUtils.isEmpty(event.getSessionId())) {
                    mValidVector.add(event);
                    refreshSession();
                    continue;
                }
                //保存事件到数据库
                UBTEventDBManager.getInstance().insert(event);
                LogUtils.d(DRUBT.LOG_TAG + "保存成功一条数据");
            } catch (Exception e) {
                if (event != null) {
                    //发生异常将事件保存在重试队列中
                    mValidVector.add(event);
                }
                LogUtils.d(DRUBT.LOG_TAG + "保存事件发生异常:" + e.getMessage());
                e.printStackTrace();
            }
        }
    }

UBTUploader.java

    @Override
    public void run() {
        while (!mCloseFlag.get()) {
            try {
                Thread.sleep(SLEEP_TIME);
                List<UBTEventDBModel> list = UBTEventDBManager.getInstance().findList(MAX_UPLOAD_SIZE);
                if (ArrayUtils.isEmptyList(list)) {
                    continue;
                }
                if (list.size() < MIN_UPLOAD_SIZE) {
                    waitUploadCount++;
                    if (SLEEP_TIME * waitUploadCount < MIN_UPLOAD_TIME) {
                        continue;
                    }
                    //休眠结束后重新拿一次数据上传
                    list = UBTEventDBManager.getInstance().findList(MAX_UPLOAD_SIZE);
                }
                uploadEvent(list);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

上一篇下一篇

猜你喜欢

热点阅读