介绍
EventBus Android 发布/订阅事件总线,可简化 Activities, Fragments, Threads, Services 等组件间的消息传递,可替代 Intent, Handler, BroadCast ,接口等传统方案,更快,代码更小,50K 左右的 jar 包,代码更优雅,彻底解耦。官网地址:https://github.com/greenrobot/EventBus ,官方文档:http://greenrobot.org/eventbus/documentation。我看到这个可以代替Intent、Handler\BroadCast的功能,我就想学习学习了,再此mark一下。
图形如下:
- Publisher 事件的发布者
- Event 传递的事件对象
- Subscriber 事件的订阅者
使用步骤
(1)在gradle中添加的依赖:
compile 'org.greenrobot:eventbus:3.0.0'
(2)和组件的生命周期绑定,例如在Activity里面绑定:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
(3)post 发布事件:
直接发布EventBus.getDefault().post(参数);
滞留发布EventBus.getDefault().postSticky("参数");
(4)订阅者接收事件
//ThreadMode里面有四个模式:NAIN UI主线程、BACKGROUND 后台线程、 //POSTING 和发布者处在同一个线程、ASYNC 异步线程 @Subscribe(threadMode = ThreadMode.MAIN) public void onDataSynEvent(DataSynEvent event) { // do something }
(5)定义一个事件的bean对象
public class MessageEvent { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public MessageEvent(String message) { this.message = message; } }
===============================demo 下文=============================
写一个EvenMessage对象
public class MessageEvent {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public MessageEvent(String message) {
this.message = message;
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<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"
android:orientation="vertical"
tools:context="com.song.evenbusdemo.MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Hello World!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_text"
android:onClick="eventBusClick"
android:layout_centerHorizontal="true"
android:text="EnventBus" />
</RelativeLayout>
MainActivity
package com.song.evenbusdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
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 tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv_text);
EventBus.getDefault().register(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
public void eventBusClick(View view){
EventBus.getDefault().post(new MessageEvent("Test EvenMessage"));
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
tv.setText(event.getMessage());
}
}
===============================demo 上文=============================
混淆
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode {
*;
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}