"Error in retrofit api call" 完成 observable 而不是让其他 observable 发出项目
"Error in retrofit api call" completes the observable instead of letting the other observable emit items
我有两个 observable,一个从 SharedPreferences
获取列表,另一个从 api 获取列表并进行改造(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
mergeDelayError
不会消除错误,它只是延迟其他可观察对象完成发射项的时间。
您可能想尝试使用 onErrorReturn
例如:
instance.getListFromSharedPrefs().mergeWith(instance.getListFromApi().onErrorReturn(Observable.empty())
忽略 API 调用中的网络。
问题很可能是 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(...);
我有两个 observable,一个从 SharedPreferences
获取列表,另一个从 api 获取列表并进行改造(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
mergeDelayError
不会消除错误,它只是延迟其他可观察对象完成发射项的时间。
您可能想尝试使用 onErrorReturn
例如:
instance.getListFromSharedPrefs().mergeWith(instance.getListFromApi().onErrorReturn(Observable.empty())
忽略 API 调用中的网络。
问题很可能是 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(...);