MailOtto 實現完美預加載以及源碼解讀

背景:git

    最近項目組須要一個小課題分享,小白恰好從微博裏看到一個這樣有趣的開源工具MailOtto,是阿里巴巴員工 Drakeet 維護的一個專一懶事件的事件總線,gitHub地址爲:https://github.com/drakeet/MailOtto ,Drakeet的我的地址爲:https://drakeet.me/mailotto-sample ,我的以爲挺有用,實用起來很方便,就介紹給你們了,小白在學習的過程當中經過研究了源碼,明白了做者在最後說的,MailOtto毫不僅僅是可以完美實現預加載,還能夠代替startActivityForResult,甚至還有同時擁有 Otto/EventBus 的功能的精髓。github

MailOtto使用工具

   藉着做者的一個小Demo:在第一個頁面預先爲第四個頁面預加載數據,模擬加載數據的時間須要8S,當咱們進入到第四個頁面的時候,若是數據尚未加載完成,咱們還會繼續等待。這樣就完美實現了預加載的效果。post

   第一步:學習

 

    第二個框框內順便說了一下,這裏用若引用的目的,是爲了防止內存泄露,具體緣由爲:非靜態匿名內部類持有一個對外部類的隱士引用,而靜態內部類不會,在InnerRunable裏面,咱們把數據經過Mail這個類把數據傳給了目標處理類。這樣子咱們就能夠繼續作其餘事情了。this

  第二步:spa

  在目標頁面裏面只須要一句   Mailbox.getInstance().atHome(this);  說明我已經在等着了,數據快來吧,就好了,如圖所示:線程

 

 

    第三步:3d

   在不變頁面編寫處理的方法,就好了,如圖所示:blog

    

  總結MailOtto的使用方法:

 1.   子線程裏取數據,而後夠經過 Mailbox.getInstance().post(new Mail("A mail from MainActivity", TargetActivity.class));   把數據發送給目標頁面,實現預加載效果

 2.   在目標頁面聲明   Mailbox.getInstance().atHome(this);   我已經來到目標頁面了,有數據就砸過來吧。

 3.   編寫惟一一個帶有@OnMailReceived  的處理方法來處理數據,結束。

 

  你必定很好奇,這過程是怎麼實現的,別急,咱們下面看看源碼就知道了。下面是源碼,若是不喜歡看源碼的能夠直接略過。

    首先是處理方法的編寫,在編譯的時候,使用發射機制在目標類能夠找到對應標識的處理類,只須要一個處理類便可,若是多個的話,在經過遍歷找出第一個。

                       

 

 

 

  以上就是對MailOtto的基本認識,使用後回發現,這是一個懶事件總線,也是一種消息,訂閱機制,其實能夠代替startActivityForResult ,據不單單用於預加載,能夠用於任什麼時候候的數據傳遞,剩下一大批判斷是否完成的操做。

相關文章
相關標籤/搜索