天天看點

EventBus的簡單使用,finish多個Activity

說明

EventBus相信大家不會陌生,它可以極大的簡化元件之間的通信,元件和背景線程之間的通信,今天我們來使用一下

我們模拟這樣一個需求,在項目中也有可能用到的

一個注冊的界面,需要下一步,下一步,最後注冊成功将資料送出然後又傳回到了主界面

我們這裡簡單使用一下,Activity之間傳遞資訊就省略了,我們就模拟一下finish多個Activity的情景

還記得郭神的第一行代碼中是如何finish多個Activity的吧,

自定義一個ActivityCollector類,把所有Activity的都add到一個List,然後for循環finish它們。

實踐

那我們今天換一種方式,簡單使用一下EventBus:

EventBus的簡單使用,finish多個Activity
EventBus的簡單使用,finish多個Activity
EventBus的簡單使用,finish多個Activity
EventBus的簡單使用,finish多個Activity
EventBus的簡單使用,finish多個Activity

1、添加依賴

compile 'org.greenrobot:eventbus:3.0.0'
           

2、自定義一個類,可以是空類,因為我們不需要傳遞一個資料,隻是去finish這個Activity,比如:

public class ActivityFinishEvent {
}
           

還是為了傳遞一個finish成功的消息,給他加一個message的屬性

public class ActivityFinishEvent {
    private String message;
    public ActivityFinishEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
           

3、在接收消息的Activity的onCreate()方法當中注冊

EventBus.getDefault().register(this);
           

4、同時也一并把解除注冊寫到onDestroy當中,防止記憶體洩漏

EventBus.getDefault().unregister(this);
           

5、接收消息的方法實作

在EventBus3.0中,聲明一個訂閱方法需要用到@Subscribe注解,方法名可以自定義,但是必須是public

MainActivity:

//訂閱方法,當接收到事件的時候,會調用該方法
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(ActivityFinishEvent event){
       textView.setText(event.getMessage());
        Toast.makeText(MainActivity.this, event.getMessage(), Toast.LENGTH_SHORT).show();
    }
           

中間的其他Activity:

//訂閱方法,當接收到事件的時候,會調用該方法
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(ActivityFinishEvent event){
        finish();
    }
           

6、發送事件

EventBus.getDefault().post(new ActivityFinishEvent("finish所有Activity,傳回到主界面"));
           

發送事件在最後一個Activity中的Button的點選事件當中進行的,所有代碼如下:

public class Main4Activity extends AppCompatActivity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new ActivityFinishEvent("finish所有Activity,傳回到主界面"));
                finish();
            }
        });
    }
}
           

至此,就完成了一次EventBus的簡單使用。

了解

寫完一個簡單的例子後,我們再加深一下EventBus的了解,EventBus是觀察者模式一個很好的實踐:

一、EventBus三要素:

Event:事件,可以是任意類型的對象

Subscriber:事件訂閱者,相當于我們在Activity中接受事件的方法, 在EventBus3.0前,隻限定于onEvent、onEventMainThread、onEventBackground、onEventAsync,在EventBus3.0後,我們可以随便取名,但是需要添加個注解@Subscribe,然後去指定線程模型。

Publisher:事件釋出者,可以在任意線程任意位置發送事件,根據post的參數類型,調用訂閱相關類型事件的方法。

二、EventBus的四種線程模型(ThreadMode):

1、POSTING(預設):釋出事件和接收事件在同一線程,避免執行耗時操作,否則會ANR

2、MAIN:事件的處理在主線程、也就是UI線程,事件處理時間不能太長,否則會ANR

3、BACKGROUND:事件在UI線程釋出出來,接收事件會在新的子線程中執行,事件在子線程釋出出來,接收事件就在這個子線程中執行,此方法中禁止進行UI操作

4、ASYNC:無論在哪個線程釋出事件,接受事件都會在建立的一個子線程中執行,同樣禁止進行UI操作

粘性事件:粘性事件釋出後會存在記憶體中,比如說我已經new了2個fragment,post發送了事件之後, 這兩個Fragment可以接受到這個事件,但是我再new2個出來,接受不到了,還得重新發送,粘性事件釋出後存在記憶體中,我再new兩個Fragment出來,一看之前有這個事件,直接比對,不用重新發送事件了。使用的話直接在注解那一行加個sticky = true;

那我們再總結一下吧,

1、EventBus接收消息是根據傳入的參數來判定的,是以我們可以發送多個事件,隻要在接收事件的Activity中添加訂閱方法,就可以接受到事件,比如:

@Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(FirstEvent event){
       
    }
           
@Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(SecondEvent event){
       
    }
           

發送的時候:

EventBus.getDefault().post(new FirstEvent());
           
EventBus.getDefault().post(new SecondEvent());
           

2、如果添加了多個參數一樣的訂閱方法,但他們的ThreadMode不同,也是會接收到消息的

@Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(FirstEvent event){
       
    }
           
@Subscribe(threadMode = ThreadMode.ASYNC)
    public void onEvent(FirstEvent event){
       
    }
           

小Demo位址:EventBus小Demo

總結

EventBus的使用基本掌握,如果在項目中有用到的話,更會加深記憶。

這裡用一個小例子熟悉了一下EventBus,記錄一下,友善同學們查閱。