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

Observable.defer()

Observable.defer() is a powerful factory due to its ability to create a separate state for each Observer. When using certain Observable factories, you may run into some nuances if your source is stateful and you want to create a separate state for each Observer. Your source Observable may not capture something that has changed about its parameters and send emissions that are obsolete. Here is a simple example: we have an Observable.range() built off two static int properties, start and count.

If you subscribe to this Observable, modify the count, and then subscribe again, you will find that the second Observer does not see this change:

    import io.reactivex.Observable;

public class Launcher {

private static int start = 1;
private static int count = 5;

public static void main(String[] args) {

Observable<Integer> source = Observable.range(start,count);

source.subscribe(i -> System.out.println("Observer 1: " + i));

//modify count
count = 10;

source.subscribe(i -> System.out.println("Observer 2: " + i));
}
}

The output is as follows:

    Observer 1: 1
Observer 1: 2
Observer 1: 3
Observer 1: 4
Observer 1: 5
Observer 2: 1
Observer 2: 2
Observer 2: 3
Observer 2: 4
Observer 2: 5

To remedy this problem of Observable sources not capturing state changes, you can create a fresh Observable for each subscription. This can be achieved using Observable.defer(), which accepts a lambda instructing how to create an Observable for every subscription. Because this creates a new Observable each time, it will reflect any changes driving its parameters:

    import io.reactivex.Observable;

public class Launcher {

private static int start = 1;
private static int count = 5;

public static void main(String[] args) {

Observable<Integer> source = Observable.defer(() ->
Observable.range(start,count));

source.subscribe(i -> System.out.println("Observer 1: " + i));

//modify count
count = 10;

source.subscribe(i -> System.out.println("Observer 2: " + i));
}
}

The output is as follows:

    Observer 1: 1
Observer 1: 2
Observer 1: 3
Observer 1: 4
Observer 1: 5
Observer 2: 1
Observer 2: 2
Observer 2: 3
Observer 2: 4
Observer 2: 5
Observer 2: 6
Observer 2: 7
Observer 2: 8
Observer 2: 9
Observer 2: 10

That's better! When your Observable source is not capturing changes to the things driving it, try putting it in Observable.defer(). If your Observable source was implemented naively and behaves brokenly with more than one Observer (for example, it reuses an Iterator that only iterates data once), Observable.defer() provides a quick workaround for this as well.

主站蜘蛛池模板: 泾阳县| 普安县| 兴业县| 淮安市| 夏津县| 保定市| 宜州市| 睢宁县| 邯郸市| 资阳市| 萨迦县| 彭泽县| 习水县| 饶河县| 子洲县| 舒城县| 伊吾县| 涟水县| 五莲县| 华宁县| 绍兴市| 屏山县| 南投市| 镇江市| 宣恩县| 青海省| 曲麻莱县| 绥芬河市| 遵义县| 汉寿县| 盐津县| 通城县| 获嘉县| 汤阴县| 宁海县| 平江县| 龙岩市| 抚州市| 巩留县| 丘北县| 麻城市|