私はRxJava/RxAndroidを使い始めたばかりですが、自分のユースケースにこだわっています。
List<A>
を反復して各A
をB
に非同期で変換しようとします(データベースへの呼び出しが必要なため)。成功するたびにObserver
に通知する必要がありますメインスレッドでいくつかのジョブを実行するための変換(onNext()
内)。
リスト全体の変換に成功し、onNext()
でList<B>
を受け取りましたが、すべてのアイテムが完了したら、アイテムごとに通知する必要があります。
演算子from
を試してみましたが、from(List<A>)
を使用する場合、Observer
は同じタイプ(A
ではなくB
からオブジェクトを受け取る必要があります_)。
List<A>
全体をlist<B>
に変換するコードは次のとおりです。ここで何を変更する必要がありますか?
private List<A> listOfA;
private startConversion() {
Observer observer = new Observer<List<B>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(List<B> convertedItems) {
onConversionCompleted(convertedItems);
}
};
Observable<B> observervable = Observable.fromCallable(new Callable<List<B>>() {
@Override
public List<B> call() throws Exception {
return convertListOfAToListOfB(listOfA);
}
});
subscription = observable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
PS:これは疑似コードです。
手伝ってくれてありがとう !
各アイテムを個別のスレッドで1つずつ変換する場合は、この方法で行うことができます。
Observable.from(list)
.map(input -> {
// transform each A -> B
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(item -> {
});
リストを出力するオブザーバブルがすでにあり、それをシーケンスに変換したい場合は、次を使用します。
listObservable
.flatMap(Observable::from)
.subscribe(item -> {
});
この2つの方法を組み合わせてすべての値を1か所で変換し、それらを1つずつ放出したい場合は、次のようにします。
Observable.create(subscriber -> {
for (Item item : items) {
subscriber.onNext(transformA2B(item));
}
subscriber.onCompleted();
});
Observable.fromIterable(list)を使用して、リストからオブザーバブルのリストを作成することもできます。次に、アイテムを反復処理してリストに変換できます。
Observable.fromIterable(list)
.filter(item -> item.getId().equals("SampleId")
.toList();
Observable
//Loop through the list and emit value one by one
.fromIterable(intList)
//Modify the list item to new item
.map(listItem -> listItem + 10)
//Update UI or do anything here
.doOnNext(System.out::println)
//Convert to new list after modifying each item
.toList()
.subscribe(
newList -> "You will get new list",
error -> "error"
);
簡単な例を示します。
_public static void main(String[] args) {
String[] s = {"a", "b", "c"};
Observable.from(s).map(value -> "A"+value).subscribe(result -> System.out.println(result));
Observable.timer(2, TimeUnit.SECONDS).toBlocking().subscribe();
}
_
あなたがリストを述べたように、私は簡単にするために配列を使用しています、リストさえfrom()
のパラメータとして使用することができます