Вы звоните s.isEmpty()
на NULL
строку, поэтому она заканчивается при первом выводе на печать.Тем не менее, onSuccess()
ничего не выбрасывает, поэтому он просто останавливает выполнение, когда выбрасывается NullPointerException
(он для вас молча обрабатывается внутри RxJava).Как только вы подписываетесь на observable, вы получаете начальное значение в onSuccess()
, затем, если оно изменяется или вы подписываетесь повторно, вы получаете другое значение в onSuccess()
, поэтому оно вызывается дважды .А поскольку onError()
относится к ошибкам, возникающим в цепочке операций, вы не получите ошибку в onSuccess()
при возникновении исключения.
Такое поведение является преднамеренным.Согласно договору Rx, наблюдатель не должен получать и 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();
}
});
Удачи:)