java - 不理解 RxJava MaybeObserver (聊天通知不起作用)

标签 java android rx-java

我对 Java、android 和 Rxjava 很陌生。我最近注意到,在现有项目(不是我编写的)中,没有收到应该收到的聊天通知。于是我开始做一些追踪工作。下面是部分代码。

注意:收到的通知似乎总是转到文件 FCMServices 中的 onSuccess

我在下面的代码中几乎到处都放置了断点。我注意到的是,我没有收到 onSuccess 的通知,并且 onError 没有被调用,但 onComplete 却被调用。但是我觉得很奇怪,因为我认为必须在 onComplete 之前调用 onSuccessonError

我对这些函数的理解是基于http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/MaybeObserver.html

//FCMService.java
currentConversationRepo.getCurrentConversation()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new MaybeObserver<CurrentConversation>() {
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
                            currentChatDisposable = d;
                        }

                        @Override
                        public void onSuccess(@NonNull CurrentConversation currentConversation) {
                            System.out.println("This is SUCCESS");
                            if (channelSid == null && author == null && usedAdId == null){
                                buildNotifyNotification(body, action, "", userId);
                            }

                            if (channelSid != null && author != null) {
                                if (!channelSid.equals(currentConversation.getChannelSid())) {
                                    createChatNotification(author, channelSid, body);
                                }
                            }
                            currentChatDisposable.dispose();
                        }

                        @Override
                        public void onError(@NonNull Throwable e) {
                            System.out.println("Error getting current conversation: " + e.getMessage());
                            currentChatDisposable.dispose();
                        }

                        @Override
                        public void onComplete() {
                            System.out.println("This is onComplete");
                            currentChatDisposable.dispose();
                        }
                    });

然后我开始跟踪 onComplete 的调用位置,发现它是由 TestObserver 类中的另一个 onSuccess 调用的reactivex.io

http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/observers/TestObserver.html

//TestObserver.java
@Override
public void onSuccess(T value) {
    onNext(value);
    onComplete();
}

它又被 MaybeFlatMapBiSelector 类中的 onSuccess 调用。 (我相信也是一个reactivex.io类)

//MaybeFlatMapBiSSelector.java
            @Override
            public void onSuccess(U value) {
                T t = this.value;
                this.value = null;

                R r;

                try {
                    r = ObjectHelper.requireNonNull(resultSelector.apply(t, value), "The resultSelector returned a null value");
                } catch (Throwable ex) {
                    Exceptions.throwIfFatal(ex);
                    actual.onError(ex);
                    return;
                }

                actual.onSuccess(r);
            }

这原来是来自 MaybeObserver 界面

http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/MaybeObserver.html#onComplete--

我的问题是 TestObserverMaybeFlatMapBiSelectoronSuccess 到底在做什么?如果根据我提供的信息甚至有可能,为什么有些通知会转到 onComplete 而不会转到 onSuccessonErrorFCMServices.java

最佳答案

您是否尝试过评论 currentChatDisposable.dispose(); ?不久前我也遇到了同样的问题,我过早地处理了我的一次性用品,并且没有数据显示

通常在生命周期的 onPause()onDestroy() 时调用 .dispose()

PS:如果您不知道 RxJava 中的也许要么返回单个值,要么什么也不返回,或者返回一个异常。

关于java - 不理解 RxJava MaybeObserver (聊天通知不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59936023/

相关文章:

android - 在 Kotlin 中使用 RXJava 映射?

java - 自定义函数: apply in Stream

java - 在 Spring Boot 自定义嵌入式 launch.script 中设置 SPRING_PROFILES_ACTIVE

java - 如何仅从 URL 字符串中提取网站名称而不是 www.和 .com 与它

Android 屏幕方向改变

java - onComplete() 在成功下载 pdf (Rxjava) 后永远不会被调用,但在使用 AsyncTask 时可以工作

java - Spring获取泛型类型类

java - 如何从可执行 jar 中的 main() 运行 TestNG 测试?

java - 自定义控件内的 Android 微调器 - OnItemSelectedListener 不会触发

rx-java - 如何测试 Spring WebClient 何时重试?