EventBus是一个用于Android和Java的开源库,使用发布者/订阅者模式(publisher/subscriber pattern)实现松散(loose)耦合(coupling)。EventBus使中央通信仅用几行代码就能解耦类(decouple classes)——简化代码(simplifying the code)、消除依赖(removing dependencies)和加速应用程序开发(speeding up app development)。
使用EventBus的好处:
- 简化组件之间的通信
- 解耦(decouple)事件发送方和接收方(senders and receivers)
- 能够很好地处理UI工件(例如:Activities、Fragments)和后台线程
- 避免复杂和容易出错的依赖关系和生命周期问题
- 快速;专为高性能而优化
- 很小(<50k jar)
- 在实践中是否被安装超过1亿次的应用程序所证明
- 具备高级特性,如delivery线程、订阅者(subscriber)优先级等。
更多EventBus特性:
- 方便的基于注解的API(Convenient Annotation based API):只需将@Subscribe注解添加到时订阅方方法上。由于注解的构建时索引,EventBus在应用程序运行时不需要进行注释反射。
- Android主线程递送(Android main thread delivery):当与UI交互时,EventBus可以在主线程中递送事件(deliver events),而不管事件是如何发布的。
- 后台线程递送(Background thread delivery):如果订阅服务器执行长时间运行的任务,EventBus还可以使用后台线程来避免UI阻塞。
- 事件和订阅程序继承(Event & Subscriber inheritance):在EventBus中,面向对象范式应用于事件和订阅程序类。假设事件类A是B的超类(superclass)。B类型的已发布事件也将被发布给对A感兴趣的订阅者。类似的还有订阅者类的继承也应该被考虑到。
- 跳跃式启动(Jump start):您可以立即开始 —— 不需要配置任何东西 —— 使用代码中任何地方可用的默认EventBus实例。
- 可配置的(Configurable):要根据您的需求调整EventBus,您可以使用建造者模式(builder pattern)调整它的行为。
EventBus特性:
简单但功能强大:EventBus是一个小型库,具有超级容易学习的API。尽管如此,您的软件架构可能会从解耦组件中获益良多:订阅者在使用事件时并不知道发送者。
实战测试:EventBus是最常用的Android库之一:数以千计的应用程序使用EventBus,包括非常流行的应用程序。超过10亿的应用程序安装说明了一切。
高性能:尤其是在Android上,性能很重要。对EventBus进行了大量的分析和优化;这可能是最快的解决方案。
方便的基于注解的API(不牺牲性能):只需将@Subscribe注解放到订阅方方法中。由于注解的构建时索引,EventBus在应用程序运行时不需要进行注释反射(annotation reflection),这在Android上非常慢。
Android主线程交付:当与UI交互时,EventBus可以在主线程中交付事件(deliver events),而不管事件是如何发布的。
后台线程交付:如果订阅服务器执行长时间运行的任务,EventBus还可以使用后台线程来避免UI阻塞。
事件和订阅程序继承:在EventBus中,面向对象范式应用于事件和订阅程序类。假设事件类A是B的超类。B类型的已发布事件也将被发布给对A感兴趣的订阅者。
零配置:您可以立即使用代码中任何位置上可用的默认EventBus实例启动。
可配置:要根据您的需求调整EventBus,您可以使用建造者模式(builder pattern)调整它的行为。
三步使用EventBus 3:
第一步:定义事件
事件(Events)是POJO(普通的旧Java对象),没有任何特定的需求。
package com.windfallsheng.myeventbus;
public class EventData {
public String userName;
public String message;
public EventData(String userName, String message) {
this.userName = userName;
this.message = message;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "EventData{" +
"userName='" + userName + '\'' +
", message='" + message + '\'' +
'}';
}
}
第二步:准备订阅者
订阅者实现事件处理方法(event handling methods)(也称为“订阅者方法”),这些方法将在发布事件时调用。这些是用@Subscribe注解定义的。
注意,使用EventBus 3 时可以自由选择方法名(不像EventBus 2时那样有命名约定)。
订阅者还需要将自己注册到总线(bus)并从总线注销。只有当订阅者注册时,他们才会接收事件(receive events)。在Android中,在 activities 和 fragments中,您通常应该根据它们的生命周期进行注册。
package com.windfallsheng.myeventbus;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
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 static final String TAG = MainActivity.class.getSimpleName();
private Button mBtnJumpToPost, mBtnPostStickyEvent;
private TextView mTvMessage;
private String userArray[] = {"Cyra", "Morgen", "Iris", "Mia"};
private String messageArray[] = {"我发表了新的美食文章", "我更新了我的相册", "我在FaceBook申请了账号", "我做了一个好看的小视频"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvMessage = (TextView) this.findViewById(R.id.tv_message);
mBtnJumpToPost = (Button) this.findViewById(R.id.btn_jump_to_post);
mBtnPostStickyEvent = (Button) this.findViewById(R.id.btn_post_sticky_event);
mBtnJumpToPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PostActivity.start(MainActivity.this);
}
});
mBtnPostStickyEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int uIndex = (int) (Math.random() * userArray.length);
int mIndex = (int) (Math.random() * messageArray.length);
final EventData eventData = new EventData(userArray[uIndex], messageArray[mIndex]);
Log.i(TAG, "method:onCreate#mBtnPostStickyEvent#onClick#eventData=" + eventData);
EventBus.getDefault().postSticky(eventData);
Log.i(TAG, "method:onCreate#mBtnPostStickyEvent#onClick#Post sticky event finish.");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.i(TAG, "method:onCreate#mBtnPostStickyEvent#onClick#postDelayed#准备跳转至StickyActivity");
StickyActivity.start(MainActivity.this);
}
}, 2000);
}
});
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void refreshMessage(EventData eventData) {
Log.i(TAG, "method:refreshMessage#eventData=" + eventData);
mTvMessage.setText(eventData.getUserName() + ":\n\n" + eventData.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
第三步::发布事件
从代码的任何部分发布(post)事件。所有当前注册的与事件类型(event type)匹配的订阅者都将收到它。
package com.windfallsheng.myeventbus;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import org.greenrobot.eventbus.EventBus;
/**
* Created by Administrator on 2016/11/17 0017.
*/
public class PostActivity extends AppCompatActivity {
private static final String TAG = PostActivity.class.getSimpleName();
private Button mBtnSendEventData;
private String userArray[] = {"Cyra", "Morgen", "Iris", "Mia"};
private String messageArray[] = {"我发表了新的美食文章", "我更新了我的相册", "我在FaceBook申请了账号", "我做了一个好看的小视频"};
public static void start(Context context) {
context.startActivity(new Intent(context, PostActivity.class));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "method:onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
mBtnSendEventData = (Button) this.findViewById(R.id.btn_send_event_data);
mBtnSendEventData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int uIndex = (int) (Math.random() * userArray.length);
int mIndex = (int) (Math.random() * messageArray.length);
EventData eventData = new EventData(userArray[uIndex], messageArray[mIndex]);
Log.i(TAG, "method:onCreate#mBtnSendEventData#onClick#eventData="+eventData);
EventBus.getDefault().post(eventData);
// finish();
}
});
}
}
由于作者水平有限,语言描述及代码实现中难免有纰漏,望各位看官多提宝贵意见!
Hello , World !
感谢所有!