"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(...);