Android开发 之——利用RxBus实现数据更新
2017-01-17 09:28
751 查看
以前我们要想在activity或fragment之间传递信息,我们会通过onActvityResult接收信息。但是这样有一个缺点,一个是代码量太大,重复率太高。二是有时候传递的数据需要经过几个界面的跳转。加入从A->B->C,C界面修改了某些信息,同时,想在A界面进行界面的刷新。那么通过onActvityResult的话很难操作。还有就是,加入从A->B,B传递信息给A界面。以往通过onActvityResult,我们需要在B界面关闭的时候,A界面才能拿到数据,再进行局部刷新,这样的话,A界面很可能会闪烁(数据刷新)。这样的话用户体验感就很差了。那么现在,我们可以怎么做呢。首先,大家最好先了解一下Rxjava,下面是简单的介绍:RxJava 是 ReactiveX在 Java 上的开源的实现。Observable(观察者)和 Subscriber(订阅者)是两个主要的类。在 RxJava 上,一个 Observable 是一个发出数据流或者事件的类,Subscriber 是一个对这些发出的 items (数据流或者事件)进行处理(采取行动)的类。一个 Observable 的标准流发出一个或多个 item,然后成功完成或者出错。一个 Observable 可以有多个 Subscribers,并且通过 Observable 发出的每一个 item,该 item 将会被发送到 Subscriber.onNext() 方法来进行处理。一旦Observable 不再发出 items,它将会调用 Subscriber.onCompleted() 方法,或如果有一个出错的话 Observable 会调用 Subscriber.onError() 方法。首先,附上rxjava/rxandroid的链接,或者直接到github搜索查看最新版本链接 rxBus的使用必须依赖 rxJava 和 exAndroid
compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0'废话不多说,直接附上RxBus的代码
public class RxBus { private static volatile RxBus defaultInstance; private final Subject<Object, Object> bus; // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者 public RxBus() { bus = new SerializedSubject<>(PublishSubject.create()); } // 单例RxBus public static RxBus getDefault() { if (defaultInstance == null) { synchronized (RxBus.class) { if (defaultInstance == null) { defaultInstance = new RxBus(); } } } return defaultInstance ; } // 发送一个新的事件 public void post (Object o) { bus.onNext(o); } // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 public <T> Observable<T> toObservable (Class<T> eventType) { return bus.ofType(eventType); // 这里感谢小鄧子的提醒: ofType = filter + cast // return bus.filter(new Func1<Object, Boolean>() { // @Override // public Boolean call(Object o) { // return eventType.isInstance(o); // } // }) .cast(eventType); } }12345678910111213141516171819202122232425262728293031323334351234567891011121314151617181920212223242526272829303132333435代码很简单,先创建一个单例的Rxbus对象,然后可以通过post发出一个事件,发起者作为一个被观察者。或者通过toObservable观察一个事件。这里解释一下rxjava一般来说有三种动作:onNext,onComplete,OnError.分别对应接下来的动作,还有完成时的动作,出错时的动作。public Observable toObservable (Class eventType) 这里通过泛型传入一个对象,然后对这个对象进行观察。那现在可以通过代码来介绍一下如何发起一个事
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(String username, String password) { this.username = username; this.password = password; } } User user = new User("潘锐杰","123456"); RxBus.getDefault().post(user);12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829首先,我们要新建一个User对象,作为我们所要发出去的数据。 然后new出一个对象,通过RxBus.getDefault().post();将数据发出去,那么此时,对这个事件订阅的,就会接收到一个通知。其实rxjava就是观察者模式的一个实现。那么,我们看看怎么接收到数据,代码如下:
RxBus.getDefault().toObservable(InvitationMessage.class) //在io线程进行订阅,可以执行一些耗时操作 .subscribeOn(Schedulers.io()) //在主线程进行观察,可做UI更新操作 .observeOn(AndroidSchedulers.mainThread()) //观察的对象 .subscribe(user->{ //获取到了一个对象,user Toast.makeText(this,user.getUsername(),Toast.LENGTH_SHORT).show(); });123456789123456789观察对象的时候我使用了lambda表达式进行简写,这是JAVA8的新特性,有兴趣的可以去了解一下,还有一些操作符,如map,flatmap,filter,zip等操作,这里就不做演示了。这里的代码效果和上面的代码是一样的,如果使用了java8的朋友,在new Action1() 这里按一下ALT+ENTER,就可以进行简化代码。
RxBus.getDefault().toObservable(InvitationMessage.class) //在io线程进行订阅,可以执行一些耗时操作 .subscribeOn(Schedulers.io()) //在主线程进行观察,可做UI更新操作 .observeOn(AndroidSchedulers.mainThread()) //观察的对象 .subscribe(new Action1<User>() { @Override public void call(User user) { Toast.makeText(this,user.getUsername(),Toast.LENGTH_SHORT).show(); } });12345678910111234567891011有人说,那这样的话,rxbus跟eventBus做的东西不就一样了吗?那直接用eventBus不就好了。Rx:函数响应式编程,EventBus:事件总线 RxJava 主要做异步、网络的数据处理,强大之处就是数据的处理了,而对于处理完后的数据处理是一样的都是观察者模式来通知 ,通过操作符可以执行链式调用,代码清晰。 结合retrofit2,做网络请求的话,可以让网络请求变的十分优雅,当然,使用RxJava那就不用导入eventbus了,那是不是体积更小了。至于用哪个,还是看个人喜好吧。。。
相关文章推荐
- Android开发之--- 使用RxBus实现页面之间的数据实时更新
- Android开发之ListView利用OnScrollListener实现分页加载数据
- Android开发——利用Cursor+CursorAdapter实现界面实时更新
- Android开发(11)-利用listview控件显示person表中的所有数据(并实现点击触发拨号程序)
- Android开发——利用Cursor+CursorAdapter实现界面实时更新
- Android开发——利用Cursor+CursorAdapter实现界面实时更新
- android中的websocket 应用 websocket 在实际的应用中不仅仅能做聊天应用,还可以利用websocket长连接保持数据的实时更新以及信息的推送。 websocket 的实现的
- Android开发探秘之四:利用Intent实现数据传递
- Android开发之---两个Activity之间利用广播机制更新数据
- android中的websocket 应用 websocket 在实际的应用中不仅仅能做聊天应用,还可以利用websocket长连接保持数据的实时更新以及信息的推送。 websocket 的实现的
- Android开发之利用Intent实现数据传递的方法
- Android开发——利用Cursor+CursorAdapter实现界面实时更新
- android 开发利用 html5 JavascriptInterface 实现应用层与 native 互传参数并获取返回数据
- Android开发之ListView利用OnScrollListener实现分页加载数据
- 利用反射Android开发之开启关闭数据连接实现
- Android开发(11)-利用listview控件显示person表中的所有数据(并实现点击触发拨号程序)
- 【原创】SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- 利用数据库复制技术 实现数据同步更新
- 利用数据库复制技术 实现数据同步更新
- 利用ASP和XML实现客户端多表单域数据动态更新