2

私はRxJava2を介して戦っています。私の解決策が受け入れられるかどうか、またはそれを改善する方法があるかどうか疑問に思っています。

使用事例

  1. ユーザーがデータ更新ボタンを押す
  2. ダイアログが表示されます - お待ちください
  3. 複数のバックエンド呼び出しが並行して処理されます
  4. これらのいずれかが終了するとすぐに、データはローカル データベースに保存されます
  5. すべてのリクエストが終了したら (バックエンド コールと永続化)、ダイアログを閉じる必要があります。

現在のソリューション

私はCompletablesこのように見えるいくつかを持っています:

Completable organisationUnitCompletable = backendService.getOrganisationUnits()
    .doOnNext(data -> organisationUnitDao.saveInTx(data))
    .ignoreElements()
    .subscribeOn(Schedulers.io());

Completable locationCompletable = backendService.getLocations()
    .doOnNext(data -> locationDao.saveInTx(data))
    .ignoreElements()
    .subscribeOn(Schedulers.io());

Completable prioritiesCompletable = backendService.getPriorities()
    .doOnNext(data -> priorityDao.saveInTx(data))
    .ignoreElements()
    .subscribeOn(Schedulers.io());

リストに追加し、merge演算子を使用して、それらを 1 つにパックします。

List<Completable> compatibles = new ArrayList<>();
compatibles.add(organisationUnitCompletable);
compatibles.add(locationCompletable);
compatibles.add(prioritiesCompletable);

Completable.merge(compatibles)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> {
     progressDialog.dismiss();
});

可能な改善

わかりましたので、これは意図したとおりに機能します。しかし、あまり嬉しくないものがあります。

subscribeOn(Schedulers.io())各 Completableに を本当に追加する必要がありますか? それなしでは並行して動作しませんが、これを行うためのより良い方法があるでしょうか?

すべての補完可能なものにはこれらの行があります。

    .ignoreElements()
    .subscribeOn(Schedulers.io());

それを1つのメソッドに抽出する方法はありますか? 私はこのようなことを試しました:

private <T> Completable prepareCompletable(Function<Void, Observable<List<T>>> source, AbstractDao<T, Long> dao) {

    Completable orderTypeCompletable = source
            .doOnNext(data -> dao.saveInTx(data))
            .ignoreElements()
            .subscribeOn(Schedulers.io());
}

Observable と DAO を入れるだけです。もちろん、それはコンパイルされません。ジェネリックについては、私がすでに持っているよりもはるかに多くの知識が必要なようです。

長い質問で申し訳ありません。ユースケース全体を短い言葉で説明するのは難しいです。

4

1 に答える 1

2

各 Completable に subscribeOn(Schedulers.io()) を本当に追加する必要がありますか?

はい。ただし、 の後は必要ありませんCompletable.merge()

それを1つのメソッドに抽出する方法はありますか?

public static <T> Function<Flowable<T>, Completable> applyIgnore() {
    return f -> f.ignoreElements().subscribeOn(Schedulers.io());
}

Completable locationCompletable = backendService.getLocations()
.doOnNext(data -> locationDao.saveInTx(data))
.to(applyIgnore());
于 2016-11-26T18:56:49.593 に答える