天天看點

EventBus和Otto第三方架構

第11天EventBus和Otto第三方架構

EventBus

一.EventBus介紹:

二.EventBus三大要素

三.EventBus四種線程模型

四.代碼案例:

Otto第三方架構

EventBus

一.EventBus介紹:

EventBus能夠簡化各元件間的通信,讓我們的代碼書寫變得簡單,能有效的分離事件發送方和接收方(也就是解耦的意思)。

二.EventBus三大要素

Event 事件。它可以是任意類型。

Subscriber 事件訂閱者。

Publisher 事件的釋出者。我們可以在任意線程裡釋出事件,一般情況下,使用EventBus.getDefault()就可以得到一個EventBus對象,然後再調用post(Object)方法即可。

三.EventBus四種線程模型

POSTING (預設) 表示事件處理函數的線程跟釋出事件的線程在同一個線程。

MAIN 表示事件處理函數的線程在主線程(UI)線程,是以在這裡不能進行耗時操作。

BACKGROUND 表示事件處理函數的線程在背景線程,是以不能進行UI操作。如果釋出事件的線程是主線程(UI線程),那麼事件處理函數将會開啟一個背景線程,如果果釋出事件的線程是在背景線程,那麼事件處理函數就使用該線程。

ASYNC 表示無論事件釋出的線程是哪一個,事件處理函數始終會建立一個子線程運作,同樣不能進行UI操作。

四.代碼案例:

1, 添加依賴 compile ‘org.greenrobot:eventbus:3.1.1’

2, 注冊EventBus — onCreate() 方法中

3, 取消注冊EventBus – onDestry() 方法中

4, 明确指定訂閱者, 通過參數來傳遞消息, 同時可以指定方法在主線程中執行

5, post釋出消息

1.添加依賴:

implementation ‘org.greenrobot:eventbus:3.0.0’

1

2.定義消息事件類

public class MessageEvent{
    private String message;
    public  MessageEvent(String message){
        this.message=message;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
}
           

3.注冊和解除注冊+聲明訂閱者+事件釋出

分别在Activity的onCreate()方法和onDestory()方法裡,進行注冊EventBus和解除注冊。

注意:訂閱者的方法必須被public修飾

public class FirstActivity extends AppCompatActivity {
    private Button mButton;
    private TextView mText;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_activity);
        mButton = (Button) findViewById(R.id.btn1);
        mText = (TextView) findViewById(R.id.tv1);
        //注冊
        EventBus.getDefault().register(this);
        //釋出事件
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new MessageEvent("歡迎大家浏覽我寫的部落格"));
            }
        });
       
    }
	//聲明訂閱者
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Event(MessageEvent messageEvent) {
        mText.setText(messageEvent.getMessage());
    }
	//解除注冊
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().unregister(this);
        }
    }

           

Otto第三方架構

注意:訂閱者的方法必須被public修飾

1, 導入依賴 implementation ‘com.squareup:otto:1.3.8’

2, 定義一個類 AppBus, 繼承Bus , ---- 單例模式 , 傳回Bus 的子類對象

3, 注冊到Bus 的主線程中

AppBus.getInstance().register(this);

4, 在onDestry() 方法中取消注冊

@Override
	protected void onDestroy() {
		super.onDestroy();
		AppBus.getInstance().unregister(this);
	}
           

5, 聲明訂閱者

@Subscribe
	public void receiveMessage(String result)
	{
		Toast.makeText(this, "result =  " + result, Toast.LENGTH_SHORT).show();
	}
           

6, 發起訂閱 – 主線程中