我有一个使用RESTful API的应用程序,我正在使用RxJava的Retrofit来实现这一点。 UI使用MVVM模式,利用Android数据绑定库。视图模型通过使用名为DataManager
的类向API发出请求,该类将调用委托给相应的服务以返回视图模型随后订阅并处理响应的Observable
。到目前为止,除了一件事之外,它的工作非常奇妙。订阅本质上绑定到视图模型,视图模型又绑定到Fragment
,因此当用户离开屏幕时,所有订阅(我在CompositeSubscription
中维护)都被取消订阅以防止内存泄漏。现在,根据RxJavaCallAdapterFactory
这意味着底层Call
被取消的方式的性质,意味着API请求被取消。现在在大多数情况下这没有问题,如果用户导航离开仍在加载的页面,取消调用是有意义的。 (此时我应该注意到我的Fragments
在配置更改中保留了它们的状态,所以只有在片段因用户导航而被完全销毁时才会出现问题。但是,在我的应用程序中存在某些情况,我希望调用持续存在,无论是否订阅了任何订阅。
经过一些研究后,我发现observable有cache()
和replay()
方法,无论是否订阅,都可以发布数据。这很好,但它只解决了我的一半问题。观察者只存在于视图模型中,所以一旦收集了垃圾,观察者也会这样,这意味着电话会死掉(当然?如果我错了,请告诉我)。所以我需要一种方法来保留对缓存的observable的引用,并且只有在完全完成请求后才删除它们。
我现在的想法是让一个单例类保留一系列可观察的内容来缓存在内存中。然后,当调用onComplete
时,这些可观察对象将从列表中删除。
public class ObservableCache {
private static final ObservableCache INSTANCE = new ObservableCache();
private final List<Observable<?>> cache;
public static ObservableCache instance() {
return INSTANCE;
}
public ObservableCache() {
cache = new ArrayList<>();
}
public void cacheObservable(Observable<?> observable) {
cache.add(observable.cache().doOnCompleted(() -> cache.remove(observable)));
}
}
我想了解一下如何解决这个问题,以及我建议的方法是否可行。我无能为力,但觉得它有问题,但我无法弄清楚是什么......