【发布时间】:2015-11-30 23:29:43
【问题描述】:
我在我的应用程序中使用 Rx 来执行 api 调用,我期待按以下顺序执行此操作
- 检查是否有互联网连接
- 如果为真(从 1 开始),调用 api 获取结果
- 然后将结果保存到磁盘缓存中
- 如果为 false(从 1 开始)发送错误通知并从磁盘缓存加载数据。
为此,我有 Observable 可以从磁盘缓存中获取存储的数据:
@Override
public Observable<StoryCollectionEntity> getStroty(String id) {
return Observable.create(new Observable.OnSubscribe<StoryCollectionEntity>() {
@Override
public void call(Subscriber<? super StoryCollectionEntity> subscriber) {
//readFileContent
//deserializeS fileContent
subscriber.onNext(storyCollectionEntity);
subscriber.onCompleted();
subscriber.onError()
}
});
}
还有以下将缓存保存在磁盘中:
@Override
public void putStory(StoryCollectionEntity storyCollectionEntity) {
// save in the disk
}
我能够成功保存和检索数据,但我觉得我的代码不够好,因为有时从 api 检索的数据没有保存在磁盘缓存中 我也在 onErrorResumeNext 上调用缓存数据,我认为这是错误的方式。
这是我的代码:
@Override
public Observable<StoryCollectionEntity> storyEntityList() {
return this.restApi.storyCollection()
.doOnNext(saveStoryCollectionToCache)
.onErrorResumeNext(
storyCache.getStroty(StoryCollectionEntity.class.getName()));
}
这里saveStoryCollectionToCache 是:
private final Action1<StoryCollectionEntity> saveStoryCollectionToCache =
storyCollectionEntity ->
{
if (storyCollectionEntity != null) {
storyCache.putStory(storyCollectionEntity);
} };
您能否就如何实现我的案例的最佳实施提供帮助。在调用restApi之前如何检查互联网连接?
非常感谢
【问题讨论】:
-
我在序列中看不到任何会阻止将 API 调用结果保存到磁盘的原因。保存可能会失败(权限错误、锁定文件等)并且 onErrorResumeNext 隐藏了这个事实。如果你不关心异常的原因,想继续缓存数据,onErrorResumeNext 是可以接受的。
-
除了 onErrorResumeNext 之外,还有什么可以使用的选项。还有我如何在调用 api 之前检查互联网连接
-
我不懂Android,所以无法帮助网络测试。
标签: android rx-java rx-android