EventBus 3.0: 入門使用及其使用 完全解析
阿新 • • 發佈:2018-07-25
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: 入門使用及其使用 完全解析