我有一个正在执行网络请求并发出数据的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
答案 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