2 回答

TA貢獻1775條經驗 獲得超8個贊
您正在調用s.isEmpty()一個NULL字符串,這就是它在第一次打印時結束的原因。也就是說onSuccess()不會拋出任何東西,所以它只是在NullPointerException拋出時停止執行(它在 RxJava 中為你默默地處理)。一旦你訂閱 observable,你就會得到 in 的初始值onSuccess(),然后如果它發生變化或者你重新訂閱你會得到另一個值 in 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();
}
});
祝你好運 :)
添加回答
舉報