接上篇,看看部分源代码,没什么干货,已脱裤子的请绕路。
埋点记录类:Recorder.java
可以看到record方法,只是将埋点的存储动作(iLogCache.record)封装成 Runnable,然后通过持有的 Handler 对象 post 给 相应的 HandlerThread。HandlerThread 接受该消息后便执行该动作。
Recorder.java 职责分明,就只有record 方法,然后没了。
埋点发送类:Sender.java
可以看到 send方法,只是将埋点的发送动作(trySend 网络请求方法)封装成 Runnable,然后通过持有的 Handler 对象 post 给 相应的 HandlerThread。HandlerThread 接受该消息后便执行该动作。
这里加上了重试方法,发送失败会通过 Recorder对象再次存储起来,直至三次重试之后。
同样 Sender 也是职责分明,只负责发送 (send方法)。
埋点读取类:ReaderThread (线程)
埋点读取类只是简单的一直轮询数据缓存对象(ILogCache),当不为空的时候,通过埋点发送类(Sender)发送埋点。
最后,LogServiceV2.java
LogServiceV2 继承了Service。在init 方法里初始化了 Recorder,Sender,ReaderThread 这三个关键角色。
整个方案的源代码篇到此结束。
至于怎么用嘛,
startService,然后调用Recorder.record方法就可以了。实际项目里,也仅有LogServiceV2 与 Recorder 对外公开,而Recorder 更是一个单例,方便外层直接 getInstance().record()。
贴了代码,有没有清晰些呢,各位看官。