RxAndroid按钮点击观察者?

RxAndroid按钮点击观察者?

问题描述:

嗨同行程序员,RxAndroid按钮点击观察者?

我正在使用RxAndroid在按下按钮时每隔3秒进行一次间隔API调用。

private final CompositeDisposable disposables = new CompositeDisposable(); 

Observable fetchWeatherInterval = Observable.interval(3, TimeUnit.SECONDS) 
     .map(new Function<Long, String>() { 
      @Override 
      public String apply(Long aLong) throws Exception { 
       return getWeather("http://samples.openweathermap.org/data/2.5/weather?", "London,uk", "b1b15e88fa797225412429c1c50c122a1"); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()); 

Observer displayWeatherInterval = new Observer<String>() { 

    @Override 
    public void onError(Throwable e) { 
     Log.e("Throwable ERROR", e.getMessage()); 
    } 

    @Override 
    public void onComplete() { 
    } 

    @Override 
    public void onSubscribe(Disposable d) { 
     disposables.add(d); 
    } 

    @Override 
    public void onNext(String value) { 
     textViewWeatherInterval.append(value); 
    } 
}; 

buttonFetchIntervalWeather.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      fetchWeatherInterval.subscribe(displayWeatherInterval); 
     } 
    }); 

我的问题是,如果有一种方法可以使按钮(或者它的onclick监听器)可观察到过,并与其他IT连锁。

类似buttonFetchIntervalWeather.subscribe(fetchWeatherInterval);

使用RxBinding

Subscription s = RxView.clicks(button) 
     .throttleFirst(5, TimeUnit.SECONDS) // maybe you want to ignore multiple clicks 
     .flatMap(foo -> fetchWeatherInterval) 
     .subscribe(displayWeatherInterval); 

throttleFirst只是停止进一步事件5秒左右,所以如果用户多次点击按钮,同样fetchWeatherInterval不会被再次触发,在接下来的5秒,当然。

flatMap将一个observable的输出转换为另一个observable,在这种情况下,从click事件转换为fetchWeatherInterval。如果您需要更多信息,请阅读文档。

另外,RxJava2的工作原理,我只是回答了RxJava1。只需将订阅更改为一次性。

使用Observable.create()

Observable.create(new Action1<Emitter<View>>() { 
    @Override 
    public void call(Emitter<View> emitter) { 
     emitter.setCancellation(new Cancellable() { 
      @Override 
      public void cancel() throws Exception { 
       button.setOnClickListener(null); 
       emitter.onCompleted(); 
      } 
     }); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       emitter.onNext(v); 
      } 
     }); 
    } 
}, Emitter.BackpressureMode.DROP); 

或者与拉姆达:

Observable.create(emitter -> { 
    emitter.setCancellation(() -> { 
     button.setOnClickListener(null); 
     emitter.onCompleted(); 
    }); 
    button.setOnClickListener(emitter::onNext); 
}, Emitter.BackpressureMode.DROP); 
+0

我会尝试一下,回来给你。我想问一下使用这个lib是否会有问题,因为我使用Rx 2.0,它没有Subscription并且有CompositeDisposable,如果你能解释为什么我需要flatMap(可能是throttleFirst()?),你的意思是说也许使用Observable.create()。谢谢你的回答,时间很亲切。 –

+0

编辑我的答案 – Sourabh

+0

这个答案是完美的,写得很好。它帮了很多,谢谢。 –