Gak*_*ket 22 java android onclicklistener rx-java2
我想Observable使用RxJava 2 创建一个来自视图的单击侦听器.我从最简单的实现开始(我不在这里使用lambdas来向您展示此方法中的不同类型):
Observable<View> viewObservable = Observable.create(new ObservableOnSubscribe<View>() {
@Override
public void subscribe(@NonNull ObservableEmitter<View> e) throws Exception {
mNewWordView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View value) {
if (!e.isDisposed()) {
e.onNext(value);
}
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
然后我想到了onClickListener如果不需要进一步设置为null 的方法.我发现有两种类似(对我来说)名称的方法:
e.setCancellable(Cancellable c); 和
e.setDisposable(Disposable d);
它们之间有什么区别,我应该使用哪种?
aka*_*okd 25
来自Javadoc:
[
Cancellable是]一个功能接口,它有一个可以抛出的取消方法.
该Disposable不是一个功能界面以及实现它的时候dispose()方法,你不能抛出checked异常.
相比之下,许多非RxJava组件返回一个Closeable或AutoCloseable哪些是通过throws IOException并且throws Exception有些负担定义,因为你需要try-catch它.
例如,您希望在使用setCancellable文件时使用:
Observable.create((ObservableEmitter<byte[]> e) -> {
FileInputStream fin = new FileInputStream("raw.dat");
e.setCancellable(fin::close);
byte[] buffer = new byte[4096];
for (;;) {
int r = fin.read(buffer);
if (r < 0) {
break;
}
e.onNext(buffer);
}
e.onComplete();
});
Run Code Online (Sandbox Code Playgroud)
setDisposable如果你使用的话,你会使用Scheduler:
Observable.create((ObservableEmitter<Event> e) -> {
Worker worker = Schedulers.io().createWorker();
e.setDisposable(worker);
eventSource.onEvent(es ->
worker.schedule(() -> e.onNext(es))
);
});
Run Code Online (Sandbox Code Playgroud)
Kis*_*kae 14
在Cancellable最终得到包裹成Disposable所以最终的效果是对于任一呼叫相同.不同之处在于Disposable,您可能不希望实现更多功能,因此可以使用简单的Cancellable界面作为替代方案.
如果你只是想在可观察的结束使用时处理某些东西Cancellable.如果由于某些外部原因而需要处置资源Disposable以实现该Disposable.isDisposed()方法.
请注意,这些方法是互斥的.一次只能登记一次性或可取消的.调用两者都会覆盖第一个.
| 归档时间: |
|
| 查看次数: |
6464 次 |
| 最近记录: |