gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:14:14 25 4
gpt4 key购买 nike

我有两个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com