如何使用EventBus

如何使用EventBus

最近讀書會的同伴推薦了一套類似觀察者模式的套件
簡單操作一下, 發現非常容易使用。

在Android Studio的gradle加入

 compile 'de.greenrobot:eventbus:2.4.0'

首先先宣告一個操作用的類別

public class MyEvent {
    private String myEventString;

    public String getMyEventString() {
        return myEventString;
    }

    public void setMyEventString(String myEventString) {
        this.myEventString = myEventString;
    }
}

只有簡單的getter & setter
接著宣告一個簡單的dialog layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/edit_text"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="send to bus"
        android:id="@+id/send_button"/>
</LinearLayout>

畫面會長這樣
如果button按下去 就會送出event給EventBus

點下show dialog

輸入文字

接著是我們dialog的程式碼

public class SampleDialog extends Dialog{
    private Context context;
    private Button sendBtn;
    private EditText editText;
    private EventBus mEventBus;

    public SampleDialog(Context context) {
        super(context, android.R.style.Theme_Light);
        this.context = context;

        mEventBus = EventBus.getDefault();
        setContentView(R.layout.dialog_layout);
        sendBtn = (Button) findViewById(R.id.send_button);
        editText = (EditText) findViewById(R.id.edit_text);
        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyEvent event = new MyEvent();
                event.setMyEventString(editText.getText().toString());
                mEventBus.post(event);
                dismiss();
            }
        });
    }
}

接著是我們的MainActivity

public class MainActivity extends Activity {
    private EventBus eventBus;
    private TextView textView;
    private Button mShowDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        mShowDialog = (Button) findViewById(R.id.show_btn);
        mShowDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new SampleDialog(MainActivity.this).show();
            }
        });
        eventBus = EventBus.getDefault();
        eventBus.register(this);
    }

    public void onEventMainThread(MyEvent event){
        textView.setText(event.getMyEventString());
    }

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

在使用上非常簡單 一開始先註冊藍色字體的EventBus
接著寫了onEventMainThread這個方法
它是用來接收由EventBus所傳出來的物件,
當你註冊後 寫入onEventXXX()方法
EventBus會幫你找到這個方法 並且傳送你要的參數給它

所以就會看到以下的畫面

程式碼