Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android &引用;改装api调用时出错“;完成可观察项,而不是让其他可观察项发出_Android_Sharedpreferences_Retrofit_Rx Java_Rx Android - Fatal编程技术网

Android &引用;改装api调用时出错“;完成可观察项,而不是让其他可观察项发出

Android &引用;改装api调用时出错“;完成可观察项,而不是让其他可观察项发出,android,sharedpreferences,retrofit,rx-java,rx-android,Android,Sharedpreferences,Retrofit,Rx Java,Rx Android,我有两个可观察的列表,一个从SharedReferences获取列表,另一个从api(1.9.0版)获取。我使用mergeDelayError让两个观察对象即使在发生任何错误后也能发出它们的项 Observable.mergeDelayError(Observable.just(instance.getListFromSharedPrefs()), instance.getListFromApi()) .observeOn(AndroidSchedulers.ma

我有两个可观察的列表,一个从
SharedReferences
获取列表,另一个从api(1.9.0版)获取。我使用
mergeDelayError
让两个观察对象即使在发生任何错误后也能发出它们的项

    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);
                    }
                }
            });
但当我关闭并重新打开应用程序时,一切正常:

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
不会删除错误,它只是将其延迟到其他可观察对象完成发射项目时

您可能想尝试使用
onerrorrurn
例如:

instance.getListFromSharedPrefs().mergeWith(instance.getListFromApi().onErrorReturn(Observable.empty())

忽略API调用中的网络。

问题很可能是
observeOn
,它让我们在任何值之前剪切一个错误,而不管
mergeDelayError
在值之后延迟错误

有一个PR正在等待批准,它允许
observeOn
也延迟错误,但现在,您可以在
observeOn
之前应用
物化
,然后再应用
非物化

编辑示例:

Observable.mergeDelayError(
    Observable.just(
        instance.getListFromSharedPrefs()), instance.getListFromApi())
    .materialize()
    .observeOn(AndroidSchedulers.mainThread())
    .dematerialize()
    .subscribeOn(Schedulers.newThread())
    .subscribe(...);

但我也希望处理这些错误,而不是忽略它们。@MortezaRastgoo如果改型API调用中出现错误,您希望发生什么?onComplete方法是在onError之后调用的,因此,即使有我不知道的事情,也不会从
getListFromSharedPrefs
发出任何消息!请你再解释一下第二段好吗?它起作用了!但我不明白这里发生了什么。你能解释一下这个过程吗?
Observable.mergeDelayError(
    Observable.just(
        instance.getListFromSharedPrefs()), instance.getListFromApi())
    .materialize()
    .observeOn(AndroidSchedulers.mainThread())
    .dematerialize()
    .subscribeOn(Schedulers.newThread())
    .subscribe(...);