您的位置:首页 > 其它

EventBus3.0使用

2016-05-22 16:47 357 查看
EventBus简介:

EventBus是一个用于简化Andorid、Fragment、Threads、

Service之间信息传递的一个发布/订阅事件集。

简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现

使用EventBus的建议:

并不建议将应用中所有的事件都通过EventBus进行发送,尤其对于一对一的组件之间通信,建议不要使用EventBus。EventBus的使用场景更像是一种广播,当我们向EventBus发送一个事件,则该事件将会传递给多个该事件的订阅者,比如Service向Activities发送事件。跟LoacalBroadCast有点近似

在Activity和Fragment中使用EventBus时,要注意在组件的生命周期开始时registered EventBus,在生命周期结束时unregistered EventBus。否则容易导致OOM

EventBus基本用法:

1、添加依赖

compile ‘de.greenrobot:eventbus:3.0.0-beta1’

2、注册

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

initView();

//哪个类想要接收数据,注册接受事件

EventBus.getDefault().register(this);

}

3、在onDestroy中解除注册:

@Override

protected void onDestroy() {

super.onDestroy();

EventBus.getDefault().unregister(this);

}

4、订阅者

@Subscribe(threadMode = ThreadMode.MainThread)

public void helloEventBus(String message) {

mText.setText(message);

}

5、发布者

EventBus.getDefault().post(eventClass);

eEvent任意类型的值,需要和订阅者参数类型一致

在此对ThreadMode进行说明:

ThreadMode.MAIN:Android的UI线程中执行。

ThreadMode.POSTING:在和发送事件相同的线程中执行。默认的线程模式

前两个很容易理解

ThreadMode.BACKGROUND:交给EventBus的一条幕后线程去执行,注意EventBus中只有一个这样的幕后线程,所有的异步方法会在这条线程中顺序执行。要求事件处理方法不要耗时太长!

此时分两种情况:

一:如果分发事件在子线程运行,那么接收事件直接在同样线程运行

二: 如果分发事件在UI线程,那么会启动一个子线程运行接收事件

ThreadMode.ASYNC:无论分发事件在(UI或者子线程)哪个线程执行,接收都会在另外一个子线程执行对于。网络请求等可以使用这种模式!

EventBus postSticky()进行说明

当Activity进行跳转时,传值给跳转Activity,使用EventBus.getDefault().post(student);

发现无法将值传递过去,是因为,EventBus必须先注册,而跳转的Activity此时并没有实例化

所以如果想要给它传值,需要使用postSticky()方法

EventBus.getDefault().postSticky(100);

那在注册时,添加sticky属性就可以了

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)

public void onUserEvent(Integer index) {

Log.d(“flag”, “—————>index: ” + index);

//在此可以更新UI

showMessage.setText(“” + index);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: