这一系列文章原本我发表在简书。最近开始转移到掘金。之后也会在掘金发表(慢慢抛弃简书了应该,掘金的技术环境确实比简书好些)。javascript
EventBus和Otto在以前做为Android组件间通讯工具,简单方便十分受欢迎,可是也很是容易Abuse。大概有以下几个缺点:java
因为EventBus的种种缺点,以及后面RxJava的出现。不少人都开始使用RxJava来取代EventBus。甚至Otto的官方介绍里都写到:android
Deprecated!
This project is deprecated in favor of RxJava and
RxAndroid. These projects permit the same event-driven
programming model as Otto, but they’re more capable and offer better control of threading.gitIf you’re looking for guidance on migrating from Otto to Rx, this post
is a good start.github
连接是一个教你怎么使用RxJava来本身手动写一个RxBus来代替EventBus的文章。虽然看起来是在用RxJava。可是实际上却仍然在用EventBus。甚至这个封装其实也并无GreenRobot或者Otto来的好。
咱们看看Jake Wharton对RxBus的评价:
编程
再来一个GitHub的:
安全
subscribeActual部分咱们先不考虑。然而Jake指出最好不要使用Relay来“从新发明”Event Bus.app
这里看图说话:
Jake Wharton在GOTO 2016 上的讲座中提到,咱们正常的Android编程是这样的:
ide
再打个比方,虽然咱们将EventBus翻译成时间总线,可是其实总线就是Bus也就是公交车。而RxJava更像一个专车,Uber或者滴滴。他直接连接你的两个或多个须要通讯的类。传输数据,固然你能够作一个很大的专车,穿梭在全部类之间,也就是所谓的RxBus。因此在这里为何放弃RxBus也就不言而喻了不是?工具
那么,问题来了?
其实Jake 也在GitHub的讨论上给出了一个答案:
因此应该是,每当你想发布一个Event在EventBus时,直接暴露一个Observable出来。每当你想接受一个Event时,找到这个Observable而且Subscribe他。
这样作的好处是什么?
上下两个Fragment,上面的一个EditText,下面的一个TextView。上面的EditText变化的时候下面的TextView也跟着变化。
先把EditText的TextChangedListener封装在Observable里:
stringObservable = Observable.create(e -> editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
e.onNext(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
}));
/** *** */
//Expose Observable
public Observable<String> getEditTextObservable() {
return stringObservable;
}复制代码
不习惯本身封装可使用RxBinding :
stringObservable = RxTextView.textChangeEvents(editText)
.map(event -> event.text().toString());复制代码
再从咱们的TextViewFragment中 取到这个封装好的Observable:
@Override
public void onStart() {
super.onStart();
FragmentEditText fragment = (FragmentEditText) getFragmentManager().findFragmentByTag(FragmentEditText.TAG);
if(fragment != null){
fragment.getStringObservable().subscribe(s -> textView.setText(s));
}
}复制代码
来看看效果:
固然,这里还有个问题
总结:
前几天我在Reddit上看到一我的的回复:
I think EventBus on android is popular because people don't know how to share a java object reference between android components like a Fragment and an Activity, or 2 Activities and so on. So basically I think people don't know how 2 Activites can observe the same object for data changes which I think comes from the fact that we still don't know how to architect our apps properly.
我认为 EventBus在Android上火爆的缘由是人们不知道怎么去在Android组件,例如Activity/Fragment之间共享一个Java对象的引用。
这个回复能够说应该是触到了不少人的痛点。不少状况咱们用EventBus仅仅是不知道如何在多个Fragment/Activity之间共享一个对象。EventBus的作法是在Bus里登记全部的接受者。这点在RxJava里相似,Subject/ConnectableObservable 都有相似的功能。但问题是EventBus做为一个全局Bus,各类不一样类型的事件管理会很麻烦(虽然EventBus把这些事给你作好了,RxBus要本身弄)。咱们有了RxJava彻底能够避免不一样事件的管理。相同事件封装成对应Observable,根据需求选择订阅。这样保持了类型安全,提升了性能,逻辑更清晰。
想想,本身使用EventBus是否是也是这个缘由呢?