android - "Error in retrofit api call"完成 observable 而不是让其他 observable 发出项目

标签 android sharedpreferences retrofit rx-java rx-android

我有两个 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 之前应用 materializedematerialize 就在它之后。

编辑示例:

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/

相关文章:

java - 将 ImageView 设置为用户拍摄的图片

java - 如何获取使用 Intent.ACTION_OPEN_DOCUMENT 选择的文件的文件扩展名?

flutter - 如何在具有共享首选项的情况下持久保存自定义对象列表?

java - 从其他 Activity 调用对话框的方法

java - 使用 Gson 优雅地处理嵌套的 json 对象?

android - React Native - AccessibilityInfo.setAccessibilityFocus() 中的 reactTag 参数是什么?

android - Room 如何使用嵌套集合对实体建模

android - 选择根元素(又名键或信封)

android - flutter_session 和 shared_preferences 在 flutter 中不能一起工作?

java - 将 Retrofit 与 Flex Mobile 应用程序结合使用