RxJava - 如果其中一个可观察量导致错误,如何使平面图继续?



我正在创建一个应用程序,该应用程序获取设备上安装的应用程序列表,并检查来自Google Play商店的版本更新。

这是我根据包名称获取应用信息的方法:

public Observable<DetailsResponse> getUpdates(@NonNull List<ApplicationInfo> apps) {
return Observable.fromIterable(apps)
.flatMap(appInfo -> googlePlayApiService.getDetails(appInfo.packageName));
}

如果包实际上在谷歌Play商店中,它工作正常,但如果找不到包名称,它会返回retrofit2.adapter.rxjava2.HttpException: HTTP 404(即:旁加载的应用程序(

这是我处理可观察量的方法:

updatesViewController.getUpdates(apps)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.as(AutoDispose.autoDisposable(ViewScopeProvider.from(this)))
.subscribe(responseItem -> responseList.add(responseItem),
throwable -> responseList.add(null), //404's here, doesn't do the onComplete at all.
() -> { // onComplete
for (int i = 0; i < apps.size(); ++i) {
if (responseList.get(i) != null && apps.get(i).isLowerVersion(responseList.get(i)) {
doSomething();
}
});

如果所有应用程序都在Playstore中,则按预期工作。我想这样做,以便在Playstore中找不到一个或多个应用程序,它仍然可以在找到的应用程序上执行某些操作((,而忽略未找到的应用程序。任何帮助不胜感激!

当您点击其中一个 404(未在 PlayStore 中注册的应用程序(时,您可以将null(responseList.add(null)( 添加到响应列表中。

然后,从逻辑上讲,如果应用程序的版本较低,您正在检查并执行某些操作,以便您可以doSomething()。 但是检查也会检查空值(if (responseList.get(i) != null[...](,因此列表中有空值,这些空值不会做某事。

doSomething 是否依赖于项目中的某些数据?如果没有,您可以执行以下操作:

if(responseList.get(i) == null || (responseList.get(i) != null && apps.get(i).isLowerVersion(responseList.get(i)))

这将为所有较低版本或缺少的应用程序调用doSomething(例如:导致404的应用程序( 请记住上面的假设,doSomething(( 不需要来自此检索的实际数据 - 否则doSomething()中的后续操作将失败。

我对这个问题的解决方案:

我添加了一个.onErrorResumeNext(Observable.empty());,可以有效地跳过导致错误的项目。

public Observable<DetailsResponse> getUpdates(@NonNull List<ApplicationInfo> apps) {
return Observable.fromIterable(apps)
.flatMap(appInfo -> googlePlayApiService.getDetails(appInfo.packageName)
.onErrorResumeNext(Observable.empty()));
}

然后在 onComplete 中,我没有遍历我的所有应用程序,而是只遍历 responseList 中的应用程序,这主要只是一个逻辑错误,而不是 rxJava 错误。

您可以使用 onErrorResumeNext(..(

public Observable<DetailsResponse> getUpdates(@NonNull List<ApplicationInfo> apps) {
return Observable.fromIterable(apps)
.flatMap(appInfo -> googlePlayApiService.getDetails(appInfo.packageName).OnErrorResumeNext(getFallbackStream()));
}

但是,您必须记住,HTTP404不是错误,因为除非HTTP连接器将404映射到某个较低级别的throwable,否则会成功进行HTTP调用。如果没有,那么您必须执行以下操作:

if(404 == appInfo.getResponseCode()) {
return getFallbackStream();
}

flatMap里面.

相关内容

  • 没有找到相关文章

最新更新