订阅发布模式—EventBus和RxJava
EventBus
- EventBus比较适合仅仅当做组件间的通讯工具使用,主要用来传递消息。
- 使用EventBus可以避免搞出一大推的interface
- git地址:https://github.com/greenrobot/EventBus/ *
- 首先需要加载jar包,在build.gradle中添加这么句:
compile 'org.greenrobot:eventbus:3.0.0'
- 在activity中注册对象,activity消失前需要关闭注册
//注册eventBus
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
//取消注册
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
- 自定义一个实体类
/**
* 自定义类
*/
public class MessageEvent {
private String msg;
public String getMsg() {
return msg;
}
public MessageEvent(String msg) {
this.msg = msg;
}
}
- EventBus即是通过自定义的类找到传递订阅的对象,将消息发生给对方。evevt对象即是我们自定义的类的对象,再此处如果有消息传递过来,便可以接受到传递过来的消息。
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent event) {
if (event.getMsg() != null) {
System.out.println("onEventMainThread:"+event.getMsg()+" "+Thread.currentThread().getName());
textView.setText(event.getMsg());
}else {
System.out.println("event:"+event);
}
}
- 通过post类型数据过去,就可以将数据传递出去。
EventBus.getDefault().post(new MessageEvent(""))
- EventBus包含4个ThreadMode
ThreadMode.POSTING、ThreadMode.MAIN、ThreadMode.BACKGROUND、ThreadMode.ASYNC
/**
* 在后台线程中执行,如果当前线程是子线程,则会在当前线程执行,如果当前线程是主线程,则会创建一个新的子线程来执行
* @param event
*/
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventBackgroundThread(MessageEvent event){
System.out.println("onEventBackgroundThread::"+" "+Thread.currentThread().getName());
}
/**
* 创建一个异步线程来执行
* @param event
*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventAsync(MessageEvent event){
System.out.println("onEventAsync::"+" "+Thread.currentThread().getName());
}
/**
* 在主线程中运行
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMain(MessageEvent event){
System.out.println("onEventMain::"+" "+Thread.currentThread().getName());
}
/**
*默认的线程模式,在当前线程下运行。如果当前线程是子线程则在子线程中,当前线程是主线程,则在主线程中执行。
* @param event
*/
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventPosting(MessageEvent event){
System.out.println("onEventPosting::"+" "+Thread.currentThread().getName());
}
- 执行结果附图:
下一篇会讲述下更加神奇的RxJava.