【发布时间】:2015-04-16 18:16:29
【问题描述】:
假设我有一个从单独线程上的给定链接获取图像的提取器。然后图像将被缓存在内存中。一旦图像已经被缓存,获取器将不会重新获取链接。 fetcher 被认为是一个 Observable。可能有很多订阅者向获取者索要图片。在第一个订阅者订阅 fetcher 后,fetcher 将拍摄网络。但是,如果有第二个订阅者来订阅,那么获取器不应该在它之前已经获取一个请求时再发送另一个请求。之后,如果获取完成,两个订阅者都将获得图像。现在,如果有第三个订阅者来了,提取器将立即发出图像。
如何使用 RxJava 方法实现上述场景?我期望的是利用某种现有的运算符,以更具声明性的方式组合它们,最重要的是,避免同步、锁定和原子的开销。
【问题讨论】:
-
这个场景听起来像图片加载库。在 fetcher 下载图像后,该图像将作为键值对缓存在内存中,其中 url 为键。因此,其他想要获取相同图像的提取器将使用给定的 url 检查地图。通过条件检查(如 null 或不完整),它会或不会启动新的 http 请求。至于发射,除非您想保留图像,否则它是按需进行的 UI 操作。如果 ImageView 没有需要图像的需求,则不加载。
-
另外,我会使用像 Picasso 这样的图像加载库并让它处理缓存(我认为仅内存缓存图像不会让你走得太远,因为 Android 设备的内存有限)。如果您愿意,可以使用 Picasso 的
Targets 将 Picasso 包裹在Observable中。
标签: android reactive-programming rx-java