天天看點

EventBus簡單使用簡介:簡單例子EventBus的ThreadMode

簡介:

EventBus是基于觀察者/訂閱者模型

EventBus簡單使用簡介:簡單例子EventBus的ThreadMode

1.訂閱者訂閱自己希望的事件類型,釋出者将事件發送到EventBus後,由EventBus決定将事件交給哪個訂閱者處理

2.使用EventBus,EventBus最常用的幾個方法原型:

* EventBus.getDefault().register(Object subscriber);

* EventBus.getDefault().unregister(Object subscriber);

* EventBus.getDefault().post(Object event);

第一個為訂閱者訂閱事件,一旦在類中調用這個方法,EventBus就會周遊類中的方法,将聲明為處理事件的方法存起來,等到有訂閱者訂閱的事件時,就會調用相應的方法處理

第二個為取消注冊訂閱事件

第三個為發送一個事件到EventBus

注:本文例子中EventBus均為3.X

簡單例子

需求為點選第二個頁面的按鈕,改變第一個頁面的文本顯示

首先需要定義事件類型,其實也是一個類:

package com.example.eventbussimple;

/**
 * Created by user on 2016/8/4 004.
 */
public class EventBean {

    public EventBean(String name) {
        this.name = name;
    }

    public String name;
}
           

第一頁代碼如下:

package com.example.eventbussimple;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

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);//訂閱事件
        textView = (TextView) findViewById(R.id.id_text1);

        findViewById(R.id.id_button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//取消訂閱事件
    }

    //處理事件方法,在3.0以後都需要使用注解來表明這個 方法可以處理EventBus事件
    //threadMode會在下面解釋
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void handleMessage(EventBean event) {
        textView.setText(event.name);
    }
}
           

第二頁代碼為

package com.example.eventbussimple;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.greenrobot.eventbus.EventBus;

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        Button button = (Button) findViewById(R.id.id_button);
        if (button != null) {
        //點選按鈕發送事件
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    EventBus.getDefault().post(new EventBean("xiaowj"));
                }
            });
        }
    }
}
           

至此,點選第二頁按鈕,第一頁的文本就能變為xiaowj

EventBus的ThreadMode

細心的小夥伴在上面的例子中應該注意到了threadMode這個東西,簡單來說就是指明處理事件的方法要在哪種線程中執行

ThreadMode有四種枚舉類型,下面會一一解釋

  • ThreadMode.POSTING 事件處理函數在事件發送線程中執行。需要盡快處理事件,這種方式是同步調用處理函數,如果長時間處理事件會導緻阻塞事件發送線程運作
  • ThreadMode.MAIN 事件處理函數在主線程中執行(UI線程)。這個不用說,事件處理函數需要盡快處理事件,不然會導緻程式無響應
  • ThreadMode.BACKGROUND 如果發送事件線程是主線程,就新開線程處理這個事件,如果發送事件線程不是主線程,就在發送事件的線程中執行事件處理函數。這個模式也是需要盡快處理事件,如果發送事件線程不是主線程,會同步調用事件處理函數,如果沒有快速處理事件, 同樣會導緻事件發送線程阻塞
  • ThreadMode.ASYNC 新開線程處理事件,如果事件需要長時間處理,建議選用這種模式開發

    各位小夥伴可以根據上面描述選擇合适的ThreadMode處理事件

題外話,下周會更新EventBus源碼分析

繼續閱讀