RxJava:如何获取缓存数据的副本

时间:2018-01-21 14:03:42

标签: android rx-java rx-java2

我有一个正在执行网络请求并发出数据的Observable。我有这个Observable的多个订阅者,因为我不想为每个新的订阅者重新执行网络请求,所以我使用 File file = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); File f = new File(file.getPath() + File.separator + "cnt_imags" + File.separator); final Intent intent = new Intent(Intent.ACTION_SEND); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = FileProvider.getUriForFile(ReadActivity.this, BuildConfig.APPLICATION_ID ,fA); ..... intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType("image/png"); startActivity(intent); 运算符组播了Observable。这非常有效,因为replay().autoConnect()运算符会缓存旧结果,因此我的第二个订阅者会立即获取数据而无需重新执行网络请求。但问题是,我不希望修改此缓存数据。例如,一些订阅者对结果做了一些修改,我不想在第一时间反映出来。所以,基本上我不想复制网络请求,同时我也需要深度复制缓存数据。是否可以使用任何操作员?或者是否有针对此问题的Rx解决方案? 我认为我的问题很清楚。

我正在添加一个显示问题的示例代码段。

replay

1 个答案:

答案 0 :(得分:0)

假设您有两个订阅者,其中一个订阅者想要数据,而第二个订阅者正在修改数据。

Observable<String> obs =apiService.getData()
          .subscribeOn(ioThread())
          .observeOn(mainThread())
          .replay().autoConnect();

首先可以观察到获取数据

obs.subscribe((data)->{//Do what ever});

第二个Observable以某种方式修改数据

obs.map(intenseOperation())
   .subscribe((data)->{})

这样,observable都将获取数据,您可以执行特定于一个订户的操作。

简而言之,在autoconnect之前保留所有常用操作,并在不同的流中执行用户特定任务 观看这个人的谈话,了解MultiCasting:youtube-link

<强>更新

如果您想减少api请求而不是使用replay()运算符而是在api中添加自定义缓存拦截器,请参阅此stackoverflow-answer