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