zoukankan      html  css  js  c++  java
  • rxjava取代eventbus

    RxJava有多火?看看Github上star数量就知道了,那什么是RxJava呢?

    RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。

    换一种说法,RxJava 是一个响应式编程框架,采用观察者设计模式。所以自然少不了 Observable 和 Subscriber 这两个东东了。

    而针对Android,则有一个基于RxJava的RxAndroid

    甚至Jake Wharton大神还基于RxJava写了一个针对Android平台的binding apiRxBinding

    而这篇博文讲的就是基于RxJava实现的一个Event Bus->RxBus

    懂得Android的开发者都知道,目前Android上最火的两个Event Bus库是Otto和Green Robot’sEventBus,两个事件总线库写的都非常不错。不过这里不是讲事件总线,而是讲如何通过RxJava来实现事件总线的效果。

    总体来说,代码非常的简单,十几行代码就搞定了!

    首先,我们来定义一个RxBus单例类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import rx.Observable;
    import rx.subjects.PublishSubject;
    import rx.subjects.SerializedSubject;
    import rx.subjects.Subject;

    /**
    * Created by HanHailong on 15/10/9.
    */
    public class RxBus {

    private static volatile RxBus mDefaultInstance;

    private RxBus() {
    }

    public static RxBus getDefault() {
    if (mDefaultInstance == null) {
    synchronized (RxBus.class) {
    if (mDefaultInstance == null) {
    mDefaultInstance = new RxBus();
    }
    }
    }
    return mDefaultInstance;
    }

    private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());

    public void send(Object o) {
    _bus.onNext(o);
    }

    public Observable<Object> toObservable() {
    return _bus;
    }
    }

    代码非常的简单,使用呢?则更简单了,一般来讲,事件总线,包括一个发送事件和多个接收事件。

    先看发送事件的代码:

    1
    RxBus.getDefault().send(new TapEvent());

    而在你想接收事件的地方,只需要加上下面代码就可以了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    RxBus.getDefault().toObservable().subscribe(new Action1<Object>() {
    @Override
    public void call(Object event) {
    if (event instanceof TapEvent) {
    //do something
    }else if(event instanceof otherEvent){
    //do otherthing
    }
    }
    });

    这样,一个简单的Event Bus就实现了!如果你的项目已经开始使用RxJava,建议可以把Otto和Green Robot’sEventBus去掉了,直接使用RxBus!!

    当然,不要忘了在build.gradle引入RxJava和RxAndroid:

    compile 'io.reactivex:rxandroid:1.0.1'
    compile 'io.reactivex:rxjava:1.0.14'
    

     

     
  • 相关阅读:
    转载 cglib代理和java代理
    解决流不能重复使用
    @RestController的方法中 路径参数带.(点号)配置
    Spring中application*的使用
    转载自用学习 侵权删
    转载学习 多线程中的内存模型和关键字
    转载 幂等的使用
    转载学习 关于线程池
    FastJSON 转换List<T> ,Map<T,T>泛型失败 处理方法
    quartz报错 Couldn't retrieve job because the BLOB couldn't be deserialized: null
  • 原文地址:https://www.cnblogs.com/visuals/p/5292519.html
Copyright © 2011-2022 走看看