2 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
您正在調(diào)用s.isEmpty()一個(gè)NULL字符串,這就是它在第一次打印時(shí)結(jié)束的原因。也就是說onSuccess()不會拋出任何東西,所以它只是在NullPointerException拋出時(shí)停止執(zhí)行(它在 RxJava 中為你默默地處理)。一旦你訂閱 observable,你就會得到 in 的初始值onSuccess(),然后如果它發(fā)生變化或者你重新訂閱你會得到另一個(gè)值 in onSuccess(),這就是它被調(diào)用兩次的原因。并且因?yàn)槭轻槍Σ僮麈溨邪l(fā)生的錯(cuò)誤,所以在拋出異常時(shí)onError()不會出錯(cuò)。onSuccess()
這種行為是故意的。根據(jù) Rx 合同,觀察者不應(yīng)同時(shí)接收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();
}
});
祝你好運(yùn) :)

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
onError
用于沿著操作員鏈發(fā)生的錯(cuò)誤。你在里面做的onSuccess
已經(jīng)在結(jié)尾了,不會在onError
.
添加回答
舉報(bào)