1. 程式人生 > >EventBus 3.0: 入門使用及其使用 完全解析

EventBus 3.0: 入門使用及其使用 完全解析

ring 接收 ret .get parent tro eve cte idt

前言

EventBus是greenrobot再Android平臺發布的以訂閱-發布模式為核心的開源庫。
EventBus翻譯過來是事件總線意思。可以這樣理解:一個個(event)發送到總線上,
然後EventBus根據已註冊的訂閱者(subscribers)來匹配相應的事件,進而把事件傳遞給訂閱者,
這也是觀察者模式的一個最佳實踐。

我們平常開發中,當遇到Activity與Activity、Activity與Fragment之間的通信,往往采用intent,又
或者線程之間用Handler進行通信,這樣代碼會復雜很多,而使用EventBus極大簡化兩個組件之間俺的通信問題,
而且效率極高。而EventBus升級到3.0版本後,開發者能夠自定義訂閱方法名字,而沒必要
規定以“o‘n‘Event‘XX"開頭的方法了,這樣也自由化了很多,而且支持了粘性事件的分發等,因此學會使用EventBus3.0
對我們開發又極大的好處.
技術分享圖片

例子

布局

activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/tv_text"
        android:textSize="20sp"
        android:text="@string/app_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="點擊打開新的Activity"
        android:id="@+id/secondActivityBtn"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="75dp" />

</RelativeLayout>

activity_second

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    <EditText
        android:id="@+id/et"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="請輸入要發送的消息"
        />
    <Button
        android:id="@+id/sendMessageBtn"
        android:text="發送消息"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

代碼

public class MainActivity extends Activity {

    private TextView textView;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //註冊成為訂閱者
        EventBus.getDefault().register(this);
        textView = (TextView) findViewById(R.id.tv_text);
        button = (Button) findViewById(R.id.secondActivityBtn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }

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


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除註冊
        EventBus.getDefault().unregister(this);
    }
}
public class SecondActivity extends Activity {
    private EditText et;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        et = findViewById(R.id.et);
        Button button = (Button) findViewById(R.id.sendMessageBtn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(TextUtils.isEmpty(et.getText().toString())){
                    Toast.makeText(SecondActivity.this, "請輸入......", Toast.LENGTH_SHORT).show();
                    return;
                }else {
                    EventBus.getDefault().post(new MessageEvent(et.getText().toString()));
                    finish();
                }

            }
        });
    }
}

效果圖

技術分享圖片

EventBus 3.0: 入門使用及其使用 完全解析