Android 第三方的框架EventBus
一:介绍
EventBus是一种用于Android的事件公布-订阅总线,它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,能够防止因为应用播送通信而带来的诸多不便。
EventBus能够代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行办法。
二:应用
1.增加依赖
在app下的build.gradle下增加依赖:
dependencies{
//eventbus增加依赖
implementation 'org.greenrobot:eventbus:3.2.0'//第一步:增加依赖
}
2.意识EventBus
三个角色:
- Event:事件,它能够是任意类型,EventBus会依据事件类型进行全局告诉。
- Publisher:事件的发布者,能够在任意线程中公布事件。个别状况下,应用EventBus.getDefault()就能够失去一个EventBus对象,而后调用post(Object)办法即可。
- Subscriber:事件订阅者,在EventBus 3.0之前咱们必须定义以onEvent结尾的那几个办法,别离是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的办法名能够随便取,不过须要加上注解@subscribe,并且指定线程模型,默认是POSTING。( 须要注册事件的订阅者:EventBus.getDefault().register(this);EventBus.getDefault().unregister(this);this传递的是事件的订阅者Subscriber事件公布了,如果咱们须要咱们须要注册订阅它)
四种线程模型
EventBus3.0有四种线程模型,别离是: - POSTING:默认,示意事件处理函数的线程跟公布事件的线程在同一个线程
- MAIN:示意事件处理函数的线程在主线程(UI线程),因而在这里不能进行耗时操作。这是次要应用的线程模型
- BACKGROUND:示意事件处理函数的线程在后盾线程,因而不能进行UI操作。如果公布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后盾线程,如果果公布事件的线程是在后盾线程,那么事件处理函数就应用该线程。
- ASYNC:示意无论事件公布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
3.定义事件
封装一个JavaBean对象,定义事件对象
//抉择Tab事件
public class ChooseTabEvent {
private int tabId;
public ChooseTabEvent(@IdRes int tabId) {
this.tabId = tabId;
}
public int getTabId() {
return tabId;
}
public void setTabId(int tabId) {
this.tabId = tabId;
}
}
4.公布一个事件
在UI线程中公布一个事件
EventBus.getDefault().postSticky(new ChooseTabEvent(0));//抉择Tab,公布了粘连事件
4.解决一个事件
在处理事件的中须要注册事件,勾销事件注册
public class RedActivity extends BaseActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void chooseTabEvent(ChooseTabEvent event){//3.0当前办法能够自定义,这是解决了一个粘连事件,黏性事件sticky=true
if (event.getTabId()==0){
LogUtils.i(
"抉择底部tab:"
+ BOTTOM_TAB_ID_ARRAY.keyAt(BOTTOM_TAB_ID_ARRAY.indexOfValue(R.id.tab_main)));
bottomTab.setSelectedItemId(R.id.tab_main);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
黏性事件:所谓的黏性事件,就是指发送了该事件之后再订阅者仍然可能接管到的事件。
5.优先级
在Subscribe注解中总共有3个参数,下面咱们用到了其中的两个,这里咱们应用以下第三个参数,即priority。它用来指定订阅办法的优先级,是一个整数类型的值,默认是0,值越大示意优先级越大。在某个事件被公布进去的时候,优先级较高的订阅办法会首先承受到事件。
6.ProGuard 混同规定
这里gitHub上给的有
-keepattributes *Annotation*//keep反射
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;///这个牵涉到你的需要如何,如果你应用了EventBus processor进行减速,你就必须加上这个,只有有这个注解的类和办法都不混同,为反编译提供了便当。。。如果没有用到减速,这个就不必了
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# And if you use AsyncExecutor://如果你应用了ASYNC 异步线程
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
7.遇到的问题
1、若应用EventBus时出现异常:Subscriber class * and its super classes have no public methods with the @Subscribe annotation
报错的起因:应用EventBus的办法不是public,且短少@Subscribe这个注解。
依照提醒改为public,并且加上@Subscribe这个注解就Ok了
就是 EventBus.getDefault().register(this);不在public办法中
8.EventBus内存泄露
eventBus注册的时候会持有activity的援用,咱们在onDestroy反注册。若咱们的activity产生异样或零碎内存不足对activity强制回收的时候将不会走onDestroy。eventBus持有activity的援用,因而产生内存透露。而且当咱们再次关上activity时eventBus又会从新注册一次。
解决办法:注册的时候先判断activity是否注册过
if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this);
END:对可控的事件放弃审慎,不可控的事件放弃乐观。人只能做本人能力范畴内的事件,承受这个事实,并且以乐观的心,去应答这所有
发表回复