官术网_书友最值得收藏!

Handling Disposal with Observable.create()

If your Observable.create() is returning a long-running or infinite Observable, you should ideally check the isDisposed() method of ObservableEmitter regularly, to see whether you should keep sending emissions. This prevents unnecessary work from being done if the subscription is no longer active.

In this case, you should use Observable.range(), but for the sake of the example, let's say we are emitting integers in a for loop in Observable.create(). Before emitting each integer, you should make sure that ObservableEmitter does not indicate that a disposal was called:

    import io.reactivex.Observable;

public class Launcher {
public static void main(String[] args) {
Observable<Integer> source =
Observable.create(observableEmitter -> {
try {
for (int i = 0; i < 1000; i++) {
while (!observableEmitter.isDisposed()) {
observableEmitter.onNext(i);
}
if (observableEmitter.isDisposed())
return;
}
observableEmitter.onComplete();
} catch (Throwable e) {
observableEmitter.onError(e);
}
});
}
}

If your Observable.create() is wrapped around some resource, you should also handle the disposal of that resource to prevent leaks. ObservableEmitter has the setCancellable() and setDisposable() methods for that. In our earlier JavaFX example, we should remove the  ChangeListener from our JavaFX ObservableValue when a disposal occurs. We can provide a lambda to setCancellable(), which will execute the following action for us, which will occur when dispose() is called:

    private static <T> Observable<T> valuesOf(final ObservableValue<T> 
fxObservable) {
return Observable.create(observableEmitter -> {

//emit initial state
observableEmitter.onNext(fxObservable.getValue());

//emit value changes uses a listener
final ChangeListener<T> listener =
(observableValue, prev, current) ->
observableEmitter.onNext(current);

//add listener to ObservableValue
fxObservable.addListener(listener);

//Handle disposing by specifying cancellable
observableEmitter.setCancellable(() ->
fxObservable.removeListener(listener));
});
}
主站蜘蛛池模板: 大同市| 伊吾县| 蒲江县| 屏山县| 科技| 托里县| 西宁市| 南丰县| 丹寨县| 汉中市| 宁陵县| 临清市| 大足县| 彰化市| 如皋市| 陇川县| 南汇区| 岳阳县| 屯门区| 平泉县| 绩溪县| 昌吉市| 蚌埠市| 阳东县| 和硕县| 临夏市| 顺昌县| 莲花县| 鹤岗市| 嘉祥县| 封开县| 江达县| 阳春市| 西平县| 平原县| 木兰县| 娱乐| 都兰县| 麟游县| 纳雍县| 湘乡市|