RXJava记录

1、单例参考写法:

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

2、Subject 的实现类

  1.  AsyncSubject:只有当 Subject 调用 onComplete 方法时,才会将 Subject 中的最后一个事件传递给所有的 Observer。
  2. BehaviorSubject:当一个 Observer 使用了 subscribe() 方法对其进行订阅的时候,它只能收到在订阅之前发送出的最后一个结果(或者说最新的值),在这之前的结果是无法被接收到的。
  3.  PublishSubject:在已经发送了一部分事件之后注册的 Observer 不会收到之前发送的事件。
  4. ReplaySubject:无论什么时候注册 Observer 都可以接收到任何时候通过该 Observable 发射的事件。

3、用Subjec代替eventBus发送事件

/**
 * 用RXJava代替eventBus发送事件
 */
public class RXBus {
  private static volatile RXBus sRXBus;
  private final Subject<Object> mSubject = PublishSubject.create().toSerialized();
  private final Map<String, CompositeDisposable> mDisposableMap = new HashMap<>();

  public static RXBus getRXBus() {
    if (sRXBus == null) {
      synchronized (RXBus.class) {
        if (sRXBus == null) {
          sRXBus = new RXBus();
        }
      }
    }
    return sRXBus;
  }

  private  <T> Flowable<T> getObservable(Class<T> type) {
    return mSubject.toFlowable(BackpressureStrategy.BUFFER).ofType(type);
  }

  public void addSubscription(Object tag, Disposable disposable) {
    String key = String.valueOf(tag.hashCode());
    if (mDisposableMap.get(key) != null) {
      mDisposableMap.get(key).add(disposable);
    } else {
      CompositeDisposable disposables = new CompositeDisposable();
      disposables.add(disposable);
      mDisposableMap.put(key, disposables);
    }
  }

  public void unSubscribe(Object tag) {
    String key = String.valueOf(tag.hashCode());
    if (!mDisposableMap.containsKey(key)) {
      return;
    }
    if (mDisposableMap.get(key) != null) {
      mDisposableMap.get(key).dispose();
    }
    mDisposableMap.remove(key);
  }

  public void post(Object content) {
    mSubject.onNext(content);
  }

  public <T> Disposable doSubscribe(Class<T> type, Consumer<T> next, Consumer<Throwable> error) {
    return getObservable(type)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(next, error);
  }
}

4、调用方法封装

  protected void postEvent(Object content) {
    RXBus.getRXBus().post(content);
  }

  protected void unSubscribe(Object tag) {
    RXBus.getRXBus().unSubscribe(tag);
  }

  protected <M> void addSubscription(Object tag, Class<M> eventType, Consumer<M> action) {
    Disposable disposable = RXBus.getRXBus()
        .doSubscribe(eventType, action, Functions.<Throwable>emptyConsumer());
    RXBus.getRXBus().addSubscription(tag, disposable);
  }

  protected <M> void addSubscription(Object tag, Class<M> eventType, Consumer<M> action, Consumer<Throwable> error) {
    Disposable disposable = RXBus.getRXBus()
        .doSubscribe(eventType, action, error);
    RXBus.getRXBus().addSubscription(tag, disposable);
  }

5、测试代码

    addSubscription(this, String.class, new Consumer<String>() {
      @Override
      public void accept(String s) throws Exception {
        textView.setText(s);
      }
    });
postEvent("hhhoooooo");

参考文章:https://juejin.im/post/5b801dfa51882542cb409905https://www.jianshu.com/p/1257c8ba7c0c

发布了36 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/j18874964028sss/article/details/103924524
今日推荐