我有两个 observable,一个从 SharedPreferences
获取列表,另一个从 api 和 retrofit(Ver 1.9.0)获取。我使用 mergeDelayError
来让两个 observables 在出现任何错误后都发出它们的项目。
Observable.mergeDelayError(Observable.just(instance.getListFromSharedPrefs()), instance.getListFromApi())
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(new Observer<List<Item>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.d("ItemList", "Error: " + e.toString());
}
@Override
public void onNext(List<Item> Items) {
Log.d("ItemList", "ItemsFetched:" + Items.toString());
if (mAdapter != null) {
mAdapter.setItems(Items);
}
}
});
但是当 retrofit api 调用出现错误时(即没有互联网连接),整个过程在 onError
之后完成并且无法从 SharedPreferences
获取列表.
这是应用首次启动时的日志:
12-30 15:49:23.044 12197-12197/com.me.android D/itemList: SharedPrefsandroid.app.SharedPreferencesImpl@9b59793
12-30 15:49:23.189 12197-12197/com.me.android D/itemList: SharedPrefsandroid.app.SharedPreferencesImpl@9b59793
12-30 15:49:23.409 12197-12197/com.me.android D/itemList: Error: retrofit.RetrofitError
但是当我关闭应用程序并重新打开它时一切正常:
12-30 15:51:27.396 12197-12197/com.me.android D/itemList: SharedPrefsandroid.app.SharedPreferencesImpl@9b59793
12-30 15:51:27.426 12197-12197/com.me.android D/itemList: itemsFetched:[com.me.android.model.entity.item.item@676ffe9]
12-30 15:51:27.438 12197-12197/com.me.android D/itemList: SharedPrefsandroid.app.SharedPreferencesImpl@9b59793
12-30 15:51:27.618 12197-12197/com.me.android D/itemList: SharedPrefsandroid.app.SharedPreferencesImpl@9b59793
12-30 15:51:27.700 12197-12197/com.me.android D/itemList: SharedPrefsandroid.app.SharedPreferencesImpl@9b59793
12-30 15:51:27.772 12197-12197/com.me.android D/itemList: Error: retrofit.RetrofitError
最佳答案
问题很可能是 observeOn
,它让 onError 在任何值之前切入,而不管 mergeDelayError
将错误延迟到值之后。
有一个等待批准的 PR 可以让 observeOn
也延迟错误,但是现在,您可以在 observeOn
之前应用 materialize
和 dematerialize
就在它之后。
编辑示例:
Observable.mergeDelayError(
Observable.just(
instance.getListFromSharedPrefs()), instance.getListFromApi())
.materialize()
.observeOn(AndroidSchedulers.mainThread())
.dematerialize()
.subscribeOn(Schedulers.newThread())
.subscribe(...);
关于android - "Error in retrofit api call"完成 observable 而不是让其他 observable 发出项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34529562/