gpt4 book ai didi

java - 单个观察者没有调用 onError()

转载 作者:行者123 更新时间:2023-11-29 23:20:25 24 4
gpt4 key购买 nike

我在 Android 应用程序的 MainActivity 中编写了以下代码。当我运行以下代码时,它不会抛出任何异常并且 onError() 也不会被调用。但是我看到 onSuccess: testing starts 两次 但我没有看到 onSuccess: testing ends。为什么没有调用 onError() 和/或为什么应用没有崩溃?

Single.timer(1000, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.computation())
.subscribeWith(new DisposableSingleObserver<Long>() {
@Override
public void onSuccess(Long initiationTimeStamp) {
String s = null;
Log.d(TAG, "onSuccess: testing starts");
Log.d(TAG, "onSuccess:test "+ s.isEmpty());
Log.d(TAG, "onSuccess: testing ends");
}

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

最佳答案

您正在 NULL 字符串上调用 s.isEmpty(),这就是它在第一次打印时结束的原因。那就是说 onSuccess() 不会抛出任何东西,所以当 NullPointerException 被抛出时它只是停止执行(它在 RxJava 中为你静默处理)。一旦你订阅了 observable,你就会在 onSuccess() 中获得初始值,然后如果它发生变化或者你重新订阅你会在 onSuccess() 中获得另一个值,这就是为什么被调用两次。因为 onError() 是针对操作链中发生的错误,所以当异常被抛出时,您不会在 onSuccess() 中得到错误。


这种行为是故意的。根据 Rx Contract,观察者不应同时收到 onSuccess()onError()。您需要自己处理 onSuccess() 中的异常。

例如:

Single.timer(1000, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.computation())
.subscribeWith(new DisposableSingleObserver<Long>() {
@Override
public void onSuccess(Long initiationTimeStamp) {
try {
String s = null;
Log.d(TAG, "onSuccess: testing starts");
Log.d(TAG, "onSuccess:test "+ s.isEmpty());
Log.d(TAG, "onSuccess: testing ends");
}
catch (Throwable ex) {
// tell the upstream we can't accept any more data (OPTIONAL)
dispose();
// pass error to error handler
onError(ex);
}
}

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

祝你好运:)

关于java - 单个观察者没有调用 onError(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54423244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com