接上篇,看看部分源代碼,沒什么干貨,已脫褲子的請繞路。
埋點記錄類: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()。
貼了代碼,有沒有清晰些呢,各位看官。