概覽
近期接觸到EventBus,發現其對于android開發來說其實是一個很有必要的知識要點,但是之前由于項目限制,一直沒有機會使用,也不知其作用。
網上對于EventBus使用詳述的文章有很多,本文就不談使用了,僅談為什么要用EventBus。
本文各個例子都是為了方便讀者理解所寫,但是各場景不一定使用EventBus最為合適。
如有問題,歡迎評論指出。
Activity之間通信
一般來講,Activity之間通信有兩種方式:
通過Intent。
比如從一個頁面跳轉到登錄頁面,返回是否登錄成功。
將需要通信的數據先緩存(內存或者硬盤),在后一個Activity的生命周期函數中讀取。
比如在“個人信息編輯界面”將數據編輯完畢后,返回“個人信息”界面后刷新數據。
broadcast、binder、socket、contentProvider等(針對特殊情況使用)
上面幾種方式幾乎已經可以滿足所有的通信需要的,EventBus的出現不是替代他們,而是能讓一些復雜的情況變得簡單。比如以下這種情況:
1、此時有三個界面:主界面、領金幣界面(dialog,背景是主界面)、登錄界面。
在領金幣界面的時候,背景是主界面。
這種情況中,在登錄成功后,主界面是需要有UI更新的,要從未登錄狀態的UI變成登錄狀態。
但是,由于當前界面是領金幣界面,主界面的onResume和onStart是不會觸發的。
在這種情況下,要實現登錄后刷新主界面UI的需求就很復雜了。
2、登錄界面的開發
前面已經說到登錄界面直接可以用intent做。但是在一些情況下也會顯得非常復雜。
比如,當前界面嵌套了3層fragment和2層RecyclerView,那么要把Activity中的登錄頁面數據傳到相應的位置也是一個很復雜的過程。
數據模塊之間通信
一般來說,數據模塊之間通信也是兩種方式:
通過緩存,將需要通信的數據放到緩存中,在需要的位置取。
比如游戲中獲取個人對戰記錄的時候依賴于個人信息的數據。
手動控制
比如切換賬號后,“個人信息”、“個人對戰記錄”、“個人金幣信息”都需要刷新,手動控制每個數據模塊的數據更新順序。
針對一些情況,不使用EventBus的話可能實現就會比較復雜。比如以下這種情況:
在切換賬號后,除了登錄信息以外其他數據的刷新。
倘若將數據的刷新都寫在登錄界面中,即在登錄成功后手動刷新各個數據,那么這就相當于登錄界面與其他各個數據模塊耦合了。
最優的情況應當是登錄界面只負責拋出“切換賬號成功”這個事件,然后其他數據模塊主動接收這個事件,自己處理自己部分的數據刷新。
而這就可以使用EventBus來實現。
多線程之間通信
拿游戲舉例。一般游戲都會存在長連接,長連接本身會由于網絡問題出現中斷或者重連等問題。
一旦發生中斷或者重連的情況,頁面上需要有所反饋,并且可能不同頁面反饋不同,不同游戲反饋不同。因此這定然不能寫死在長連接模塊中。
理想的情況應當是長連接模塊能拋出中斷或者重連的事件,然后由需要處理的模塊來單獨處理。這樣不僅簡單化了線程間通信的問題,也實現了模塊的解耦。
EventBus注意點
使用EventBus的時候,由于事件將由其他模塊拋出,無法確定什么時候會調用到。
因此必須要做好防null,否則很容易會出現crash的情況。
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
initViews();
}
private void initViews() {
textView=new TextView(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(LoginEvent loginEvent) {
//防null
if(textView==null){
return;
}
textView.setText("EventBus test");
}
}
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。