RxJava-ReplaySubject仅发出两次数据

时间:2019-06-30 05:04:15

标签: android rx-java2 logcat reactivex

我是ReactiveX的新手,我想让我的Observable向迟来的订阅者发送数据(无论观察者订阅什么,observable都应该发出与之前发出的相同的数据)。我制作了这个Observable类,向所有观察者提供ReplaySubject的相同实例(这是单例类)。

public class AccountsObservable {
    private static ConnectableObservable<String> hotObservable;
    private static AccountsObservable accountsObservable;


    public static AccountsObservable getObject() {
        if (accountsObservable == null) {
            accountsObservable = new AccountsObservable();
        }
        return accountsObservable;
    }

    public ConnectableObservable<String> getObservable() {
        if (hotObservable == null) {
            Observable<String> observable = ReplaySubject.create(new ObservableOnSubscribe<String>() {
                @Override
                public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                    emitter.onNext("XYZ");
                    emitter.onComplete();

                }
            });
            hotObservable = observable.replay();//publish
        }
        return hotObservable;
    }
}

类似地,这是创建新观察者实例的观察者类。

public class AccountsObserver {
    AccountsFetchListener listener;

    public AccountsObserver(AccountsFetchListener listener) {
        this.listener = listener;
    }

    public Observer<String> getObserver() {
        return new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String accounts) {
                listener.onSuccess(accounts);
            }

            @Override
            public void onError(Throwable e) {
                listener.onFailure();
            }

            @Override
            public void onComplete() {

            }
        };

    }

    public interface AccountsFetchListener {
        void onSuccess(String accounts);

        void onFailure();
    }
}

这是我测试这些可观察值的功能

private void testObs() {
    ConnectableObservable<String> observable = AccountsObservable.getObject().getObservable();
    Observer<String> observer = new AccountsObserver(new AccountsObserver.AccountsFetchListener() {
        @Override
        public void onSuccess(String accounts) {
            Log.e("DATA -> ", accounts);
        }

        @Override
        public void onFailure() {
        }
    }).getObserver();
    observable.subscribe(observer);
    observable.connect();

}

我将此函数称为“ testObs()” 5次,但它仅发出2次数据。问题似乎出在我提供ReplaySUbject实例的AccountsObservable类中。谢谢

1 个答案:

答案 0 :(得分:1)

您的代码可以正常运行,根据this,您的日志在logcat中被抑制:

  

一旦应用程序每秒记录超过5行,我们便宣布该应用程序过于闲谈。请针对正在产生此开发人员详细级别的类日志记录垃圾邮件的应用程序所有者提交错误报告。日志为256KB,这意味着应用程序正在发起DOS攻击,并将日志时间跨度缩短到6秒(!),从而使其对所有其他日志都无效。

您可以通过将您的应用列入logcat的白名单来避免此行为:

adb logcat -P '<pid or uid of your app>'