我在 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/