在 android 应用程序的上下文中,我想ReplaySubject
从我从保存的包中检索的数组创建一个。
到目前为止,我有:
subject = ReplaySubject.create();
for (SomeDto dto : dtos) {
subject.onNext(dto);
}
我希望有一种更直接的方式来避免迭代。
你是说ReplaySubject吗?
如果您从包中检索的 DTO 列表是恒定的,并且订阅者在从包中检索后不需要收到更改通知,您可以只使用标准的 Observable,而无需使用主题。
List<SomeDto> dtos; // Get list of SomeDto from bundle.
Observable<SomeDto> dtoObservable = Observable.from(dtos);
每次订阅 dtoObserbale 时,它都会重播所有项目。
如果您的订阅者除了初始值之外还需要通知 DTO 列表的更改,那么您的操作方式就很好。
编辑:您可能喜欢的另一个想法。从 Bundle 中检索到的 DTO 创建一个 observable。然后将其与 DTO 主题连接起来。
List<SomeDto> dtos; // Get list of SomeDto from bundle.
ReplaySubject<SomeDto> subject = ReplaySubject.create();
Observable<SomeDto> dtoObservable =
Observable
.from(dtos)
.concatWith(subject);
// At some point later.
subject.onNext(anotherDto);
每个订阅者都将看到所有值。这是一个带有字符串的示例:
final List<String> strings = Arrays.asList("1", "2");
final ReplaySubject<String> stringsSubject = ReplaySubject.create();
final Observable<String> stringObservable =
Observable
.from(strings)
.concatWith(stringsSubject);
stringObservable
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
logger.v("stringObservable1 - " + s);
}
});
stringsSubject.onNext("3");
stringObservable
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
logger.v("stringObservable2 - " + s);
}
});
stringsSubject.onNext("4");
stringObservable
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
logger.v("stringObservable3 - " + s);
}
});
stringsSubject.onNext("5");
输出以下内容:
stringObservable1 - 1
stringObservable1 - 2
stringObservable1 - 3
stringObservable2 - 1
stringObservable2 - 2
stringObservable2 - 3
stringObservable1 - 4
stringObservable2 - 4
stringObservable3 - 1
stringObservable3 - 2
stringObservable3 - 3
stringObservable3 - 4
stringObservable1 - 5
stringObservable2 - 5
stringObservable3 - 5