RxJava使用间隔为

时间:2015-11-02 15:34:14

标签: android reactive-programming rx-java rx-android

在我的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;
    }
}

我的问题是,如何在markerLocationToReport函数中使用flatMap的当前值? 因为在当前代码中GetProductsRequest.getProducts(markerLocationToReport)发出请求时,在创建markerLocationToReport时始终使用Observable的初始值,我需要在应用生命周期内更新它。

谢谢

1 个答案:

答案 0 :(得分:2)

首先,我看到几场比赛:1)markerLocationToReport应该是易变的,因此flatMap的功能可以正确地观察它; 2)除非你从一个线程中调用getObservable,否则它可能会创建多个定时操作实例。

此外,您可以使用便捷.publish().autoConnect(0),它会立即连接,您也不必投放到ConnectableObservable