RxAndroid 按钮点击观察者?
RxAndroid button click Observer?
各位程序员大家好,
我正在使用 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 侦听器)也成为 Observable 并将其与其他按钮链接起来。
类似于buttonFetchIntervalWeather.subscribe(fetchWeatherInterval);
Subscription s = RxView.clicks(button)
.throttleFirst(5, TimeUnit.SECONDS) // maybe you want to ignore multiple clicks
.flatMap(foo -> fetchWeatherInterval)
.subscribe(displayWeatherInterval);
throttleFirst
只是在接下来的 5 秒内停止进一步的事件,因此如果用户多次单击该按钮,当然在接下来的 5 秒内不会再次触发相同的 fetchWeatherInterval
。
flatMap
将一个 observable 的输出转换为另一个 observable,在本例中是从点击事件到 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);
或使用 lambda:
Observable.create(emitter -> {
emitter.setCancellation(() -> {
button.setOnClickListener(null);
emitter.onCompleted();
});
button.setOnClickListener(emitter::onNext);
}, Emitter.BackpressureMode.DROP);
各位程序员大家好,
我正在使用 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 侦听器)也成为 Observable 并将其与其他按钮链接起来。
类似于buttonFetchIntervalWeather.subscribe(fetchWeatherInterval);
Subscription s = RxView.clicks(button)
.throttleFirst(5, TimeUnit.SECONDS) // maybe you want to ignore multiple clicks
.flatMap(foo -> fetchWeatherInterval)
.subscribe(displayWeatherInterval);
throttleFirst
只是在接下来的 5 秒内停止进一步的事件,因此如果用户多次单击该按钮,当然在接下来的 5 秒内不会再次触发相同的 fetchWeatherInterval
。
flatMap
将一个 observable 的输出转换为另一个 observable,在本例中是从点击事件到 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);
或使用 lambda:
Observable.create(emitter -> {
emitter.setCancellation(() -> {
button.setOnClickListener(null);
emitter.onCompleted();
});
button.setOnClickListener(emitter::onNext);
}, Emitter.BackpressureMode.DROP);