Weitere ähnliche Inhalte
Ähnlich wie 【Potatotips #30】RxJavaを活用する3つのユースケース (7)
Mehr von Hiroyuki Kusu (10)
Kürzlich hochgeladen (11)
【Potatotips #30】RxJavaを活用する3つのユースケース
- 6. Observable.create(subscriber -> {
// ... 裏スレッドで何か
subscriber.onNext("something");
subscriber.onCompleted();
})
.subscribeOn(Schedulers.io()) // 裏スレッドを指定
.observeOn(AndroidSchedulers.mainThread()) // メインスレッドを指定
.subscribe(res -> {
// ... メインスレッドで結果を受け取って何か
});
ちなみに重たい処理を裏スレッドで実行させたい
時にも使える(AsyncTask、AsyncTaskLoaderの替り)
- 9. public class RxEventBus {
private final Subject<Object, Object> subject
= new SerializedSubject<>(PublishSubject.create());
public <T> Subscription onEvent(Class<T> clazz, Action1<T> handler) {
return subject
.ofType(clazz)
.subscribe(handler);
}
public void post(Object event) {
subject.onNext(event);
}
}
RxEventBus.java(前項におけるイベント仲介用のクラス)
内部にSubjectを保持
継続的にイベントを発生させるには
Subject を用いる
- 10. public class RxEventBus {
private final Subject<Object, Object> subject
= new SerializedSubject<>(PublishSubject.create());
public <T> Subscription onEvent(Class<T> clazz, Action1<T> handler) {
return subject
.ofType(clazz)
.subscribe(handler);
}
public void post(Object event) {
subject.onNext(event);
}
}
RxEventBus.java(前項におけるイベント仲介用のクラス)
イベントの購読用メソッド
イベントクラス名でフィルタ
- 11. public class RxEventBus {
private final Subject<Object, Object> subject
= new SerializedSubject<>(PublishSubject.create());
public <T> Subscription onEvent(Class<T> clazz, Action1<T> handler) {
return subject
.ofType(clazz)
.subscribe(handler);
}
public void post(Object event) {
subject.onNext(event);
}
}
RxEventBus.java(前項におけるイベント仲介用のクラス)
イベントの送信用メソッド
- 15. public class SomeRepository {
private final Subject<String, String> subject
= new SerializedSubject<>(PublishSubject.create());
public final Observable<String> getObservable() {
return subject;
}
private void notify(String string) {
subject.onNext(string);
}
// ... 以降、CRUDのコード
}
内部にSubjectを保持
SomeRepository.java(前項におけるデータを保持するクラス)
- 16. public class SomeRepository {
private final Subject<String, String> subject
= new SerializedSubject<>(PublishSubject.create());
public final Observable<String> getObservable() {
return subject;
}
private void notify(String string) {
subject.onNext(string);
}
// ... 以降、CRUDのコード
}
SomeRepository.java(前項におけるデータを保持するクラス)
SubjectをObservable<T>
として外部へ公開
- 17. public class SomeRepository {
private final Subject<String, String> subject
= new SerializedSubject<>(PublishSubject.create());
public final Observable<String> getObservable() {
return subject;
}
private void notify(String string) {
subject.onNext(string);
}
// ... 以降、CRUDのコード
}
SomeRepository.java(前項におけるデータを保持するクラス)
データ変更を通知する
private メソッド
※データのCRUD時に notify() をコールする規則とする
- 23. public class Tuple3<T1, T2, T3> {
private final T1 t1;
private final T2 t2;
private final T3 t3;
private Tuple3(T1 t1, T2 t2, T3 t3) {
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
}
public T1 get1() {
return t1;
}
public T2 get2() {
return t2;
}
public T3 get3() {
return t3;
}
public static <T1, T2, T3> Tuple3<T1, T2, T3> create(T1 t1, T2 t2, T3 t3) {
return new Tuple3<>(t1, t2, t3);
}
}
3つ以上の時は Tuple 的なクラスを用意する
Observable<T> で複数の値を扱いたい場合
Observable<Pair<String, List<Integer>>>
2つの場合は Pair が使える