java - RxJava - 如果其中一个可观察对象导致错误,如何使平面图继续?
问题描述
我正在创建一个应用程序,它获取设备上安装的应用程序列表并检查来自 google play 商店的版本更新。
这是我根据包名获取应用信息的方法:
public Observable<DetailsResponse> getUpdates(@NonNull List<ApplicationInfo> apps) {
return Observable.fromIterable(apps)
.flatMap(appInfo -> googlePlayApiService.getDetails(appInfo.packageName));
}
如果包实际上在 google play store 上,它可以正常工作,但retrofit2.adapter.rxjava2.HttpException: HTTP 404
如果找不到包名,它会返回(即:sideloaded app)
这是我处理 observables 的方法:
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 中找不到一个或多个应用程序,它仍然可以对找到的应用程序执行 doSomething(),而忽略没有的应用程序。任何帮助表示赞赏!
解决方案
当您点击其中一个 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()
将失败.
推荐阅读
- go - 同时调用具有不同签名的多个函数
- mysql - 在 MySQL 中总结几十年的问题
- android - android studio 的 SHA1 密钥如何对多个用户相同?
- ruby-on-rails - Ruby 按特定要求对哈希数组进行排序
- postgresql - PostgreSQL 中的 pgadmin 有什么用途?
- postgresql-9.3 - to_number(text) 不退出你能帮忙吗?
- php - 如何在解码 JSON 后检查变量是否存在?
- django - Django查看html到pdf执行了两次
- angularjs - 如何在不使用 $timeout 的情况下知道 AngularJS 摘要周期何时结束?
- docker - 在命令服务更新下会发生什么?