RxJava 使用带区间的动态变量
RxJava use dynamic variable with interval
在我的 RxJava 代码中,我创建了一个带有间隔的 Observable。代码如下所示:
public class GetProducts implements RxRequest<Observable<ProductsResult>> {
private LatLng markerLocationToReport;
private static int TIMER = 5;
private static GetProducts INSTANCE = new GetProducts();
public static GetProducts getInstance() {
return INSTANCE;
}
private Observable obs;
private GetProducts() {
}
@Override
public Observable<ProductsResult> getObservable() {
if (obs == null) {
obs = Observable.interval(0, TIMER, TimeUnit.SECONDS, Schedulers.io())
.flatMap((tick) -> Observable.just(GetProductsRequest.getProducts(markerLocationToReport)))
.retry()
.observeOn(AndroidSchedulers.mainThread()).publish();
((ConnectableObservable) obs).connect();
}
return obs;
}
public void setMarkerLocationToReport(LatLng markerLocationToReport) {
this.markerLocationToReport = markerLocationToReport;
}
}
我的问题是,如何在 flatMap
函数中使用 markerLocationToReport
的当前值?
因为在当前代码中,当 GetProductsRequest.getProducts(markerLocationToReport)
发出请求时,在创建 Observable
时总是使用 markerLocationToReport
的初始值,我需要在我的应用程序生命周期中更新它。
谢谢
首先,我看到几个种族:1) markerLocationToReport
应该是 volatile 的,这样 flatMap
的函数可以正确观察它; 2) 除非您从单个线程调用 getObservable
,否则它可能会创建定时操作的多个实例。
此外,您可以使用方便的 .publish().autoConnect(0)
,它会立即连接,您不必强制转换为 ConnectableObservable
。
在我的 RxJava 代码中,我创建了一个带有间隔的 Observable。代码如下所示:
public class GetProducts implements RxRequest<Observable<ProductsResult>> {
private LatLng markerLocationToReport;
private static int TIMER = 5;
private static GetProducts INSTANCE = new GetProducts();
public static GetProducts getInstance() {
return INSTANCE;
}
private Observable obs;
private GetProducts() {
}
@Override
public Observable<ProductsResult> getObservable() {
if (obs == null) {
obs = Observable.interval(0, TIMER, TimeUnit.SECONDS, Schedulers.io())
.flatMap((tick) -> Observable.just(GetProductsRequest.getProducts(markerLocationToReport)))
.retry()
.observeOn(AndroidSchedulers.mainThread()).publish();
((ConnectableObservable) obs).connect();
}
return obs;
}
public void setMarkerLocationToReport(LatLng markerLocationToReport) {
this.markerLocationToReport = markerLocationToReport;
}
}
我的问题是,如何在 flatMap
函数中使用 markerLocationToReport
的当前值?
因为在当前代码中,当 GetProductsRequest.getProducts(markerLocationToReport)
发出请求时,在创建 Observable
时总是使用 markerLocationToReport
的初始值,我需要在我的应用程序生命周期中更新它。
谢谢
首先,我看到几个种族:1) markerLocationToReport
应该是 volatile 的,这样 flatMap
的函数可以正确观察它; 2) 除非您从单个线程调用 getObservable
,否则它可能会创建定时操作的多个实例。
此外,您可以使用方便的 .publish().autoConnect(0)
,它会立即连接,您不必强制转换为 ConnectableObservable
。