gpt4 book ai didi

android - 在网络调用之前改造 2 加载缓存

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:12 25 4
gpt4 key购买 nike

我正在使用改造 2 进行 API 调用,但我的问题是 API 响应需要时间来显示响应,我是否有机会存储数据并加载缓存并显示它,然后同时调用网络应用程序接口(interface)。

例如:

第一次点击 -> 进行网络调用 - 将输出呈现到屏幕,比如 ListView -> 将响应存储在缓存中

下次用户出现在屏幕上时 --> 加载缓存并将其呈现到屏幕上 --> 进行网络调用 --> 使用更改刷新适配器

我指的是要点链接之一 https://gist.github.com/Tetr4/d10c5df0ad9218f967e0

最佳答案

是的,有很多解决方案。

如果您使用 RxJava(与 retrofit 配合良好),这就是解决方案

首先是像这样使用 concat:

Observable<Data> source = Observable  
.concat(memory, disk, network).first();

内存、磁盘和网络都是 Observables。这将是第一个。这意味着如果缓存可用,则使用缓存,否则使用磁盘,否则使用网络。

问题在于,一旦有了缓存,它就永远不会访问网络。这就是为什么你应该这样做:

 getRemoteItems().publish { Flowable.merge(it,  getLocalItems().takeUntil(it)) }

这将同时获取远程数据和本地数据,但是一旦获取了远程数据就停止本地数据。您可以使用 doOnSuccess 使用远程数据填充本地数据库

是的,有很多解决方案。

首先是像这样使用 concat:

Observable<Data> source = Observable  
.concat(memory, disk, network).first();

内存、磁盘和网络都是 Observables。这将是第一个。这意味着如果缓存可用,则使用缓存,否则使用磁盘,否则使用网络。

问题在于,一旦有了缓存,它就永远不会进入网络。这就是为什么你应该这样做:

 getRemoteItems()
.doOnSuccess { storeToLocal(it) }
.publish { Flowable.merge(it, getLocalItems().takeUntil(it)) }

这意味着它在尝试获取缓存的同时获取远程项目。如果它能够获取远程数据,它会将数据存储到缓存中。

如果您使用的是第一个示例而不使用 first(),那么在最坏的情况下它会传送 3 倍的数据,但要等到之前的可观察对象完成。这意味着它将尝试内存,一旦内存调用 onComplete() 它就会进入磁盘。如果磁盘已完成,则尝试网络。

Observable<Data> source = Observable  
.concat(memory, disk, network)

关于android - 在网络调用之前改造 2 加载缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863176/

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