【问题标题】:rxjava PublishSubject second time not subscriberxjava PublishSubject 第二次不订阅
【发布时间】:2020-11-05 01:15:00
【问题描述】:
private static PublishSubject<UserBean> mPublishSubject;
private static AtomicBoolean mRefreshing = new AtomicBoolean(false);
private static Observable<UserBean> mTokenObservable;

public Observable<UserBean> getNetTokenLocked() {
    if (mRefreshing.compareAndSet(false, true)) {
        Log.e(TAG, "first    request");
        mTokenObservable.subscribe(mPublishSubject);
    } else {
        Log.e(TAG, "else  wait back");
    }
    return mPublishSubject;                         //second didn't return  
}

返回 mPublishSubject;

【问题讨论】:

标签: java rx-java2


【解决方案1】:

Publish Subject 在订阅时发出源 Observable 的所有后续项。如果您想发出源 Observable 的所有项目,无论订阅者何时订阅,请使用 Replay Subject。

PublishSubject<Integer> source = PublishSubject.create();

// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver()); 

source.onNext(1);
source.onNext(2);
source.onNext(3);

// It will get 4 and onComplete for second observer also.
source.subscribe(getSecondObserver());

source.onNext(4);
source.onComplete();

【讨论】:

  • 一个例子,5个http请求,都返回了,5个请求token过期了,那么5个请求使用refresh token,效率低,我想只用一个refresh token,那返回OK,那么五个http请求使用新的token。只有Rxjava
  • 推荐的最佳方法是使用 OkHttp3 提供的 Authenticator 接口,该接口基本上是每次收到 401 响应(未授权)时触发的接口。 Authenticator 接口覆盖了返回类型为 Request 而不是 Response 的身份验证方法,如 Interceptor 接口,它在某种程度上告诉您条件何时为肉 401 响应(未授权),然后使用新标头发出另一个请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2019-08-10
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多