オブザーバブルの連結が必要に応じて機能していません-RxAndroid

MBH

オブザーバブルを返す2つの異なるジョブを実行する2つのオブザーバブルがあります

最初のもの:私のWebサービスから医師リストを取得するためのSyncDoctors

public Observable<List<Doctor>> SyncDoctors(){
    Observable<List<Doctor>> observable = MyWebService.getInterface().GetAllDoctors();
    observable.observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.computation())
            .subscribe(new Subscriber<List<Doctor>>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(List<Doctor> doctors) {
                    if(doctors.size() == 0){
                        logger.debug("No Coming Doctors");
                        return;
                    }

                    DoctorDao doctorDao = MyApplication.getDaoSession().getDoctorDao();
                    doctorDao.deleteAll();

                    doctorDao.insertInTx(doctors);

                    logger.debug("Doctors are synced successfully to the database");
                    logger.info(doctors.size()+" doctors have been added to database");
                }
            });
    return observable;
}

私のWebサービスから患者リストを取得するための2番目のObservable

public Observable<List<Patients>> SyncPatients(){
    Observable<List<Patients>> observable = MyWebService.getInterface().GetAllPatients();
    observable.observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.computation())
            .subscribe(new Subscriber<List<Patients>>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(List<Patients> patients) {
                    if(patients.size() == 0){
                        logger.debug("No Coming Patients");
                        return;
                    }

                    PatientDao PatientDao = MyApplication.getDaoSession().getPatientDao();
                    patientDao.deleteAll();

                    PatientDao.insertInTx(Patients);

                    logger.debug("Patients are synced successfully to the database");
                    logger.info(Patients.size()+" Patients have been added to database");
                }
            });
    return observable;
}

次に、医師と患者の両方のリストを同期し、両方の同期が完了したら、タブレットの画面に表示したいと思います。

SyncAllという関数があります

public void SyncAll(){

    Observable<List<Doctor>> doctorsObservable = SyncDoctors();
    Observable<List<Patient>> patientsObservable = SyncPatients();

    Observable.concat(doctorsObservable, patientsObservable)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.computation())
            .subscribe(new Subscriber<Object>() {
                @Override
                public void onCompleted() {
                    // Here the code to show on ListView
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Object o) {
                    logger.debug("On SyncAll Next!!!");
                }
            });
}

onNext関数医師のリストと患者のリストをデータベースに保存します。

今、私がSyncDoctors()一人で呼ぶとき、それは私がSyncPatients()一人で呼ぶときも機能します、それは同様に機能します。

私が電話しSyncAll()とき、医師と患者はデータベースに保存されていません。

質問は、なぜSyncDoctors()SyncPatients()私が呼ぶとき観測onNext関数が呼び出されますSyncAll()

アレックス・シュトフ

これは、で.subscribe()を呼び出してチェーンをアクティブ化するためです。

Observable<List<Doctor>> doctorsObservable = SyncDoctors();
Observable<List<Patient>> patientsObservable = SyncPatients();

最初にobservableを作成し、次にSyncDoctors()とSyncPatients()をサブスクライブします。その後、このObservableを返しますが、Web応答はobservableの作成時にトリガーされます。これを解決するには、.map()を使用します。

public Observable<List<Doctor>> SyncDoctors(){
        final Observable<List<Doctor>> observable = MyWebService.getInterface().GetAllDoctors();
        observable.observeOn(Schedulers.io())
                // in your code you performed db io on main thread, here it is fixed
                .subscribeOn(Schedulers.io())
                .map(new Func1<List<Doctor>, List<Doctor>>() {
                    @Override
                    public List<Doctor> call(List<Doctor> doctors) {
                        if(doctors.size() == 0){
                            logger.debug("No Coming Doctors");
                            return;
                        }

                        DoctorDao doctorDao = MyApplication.getDaoSession().getDoctorDao();
                        doctorDao.deleteAll();

                        doctorDao.insertInTx(doctors);

                        logger.debug("Doctors are synced successfully to the database");
                        logger.info(doctors.size()+" doctors have been added to database");
                        return doctors;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread());
        // Notice: use Observable.defer() or you'll get the same result all the tim
        return Observable.defer(new Func0<Observable<List<Doctor>>>() {
            @Override
            public Observable<List<Doctor>> call() {
                return observable;
            }
        });
    }

.concat()はチェーン要素を実行するため、使用しないでください。.zip()。first()を使用してください。

また、1つの問題があります。メインスレッドでdb操作を実行します。データベースの更新後にチェーンをメインスレッドに移動する

.zip付きのバージョン:

void syncAll(){
    Observable<List<Doctor>> doctorsObservable = SyncDoctors();
    Observable<List<Patient>> patientsObservable = SyncPatients();
    Observable.zip(doctorsObservable, patientsObservable, new Func2<List<Doctor>, List<Patient>, Boolean>() {
        @Override
        public Boolean call(List<Doctor> doctors, List<Patient> patients) {
            return true;
        }
    })
            .first()
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean aBoolean) {
                    logger.debug("On SyncAll Next!!!");
                }
            });

}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

RxAndroidを使用してKotlin言語でいくつかのオブザーバブルを圧縮する方法

分類Dev

RxAndroidの責任の連鎖

分類Dev

RxJavaとRxAndroidの違いは?

分類Dev

RxAndroidボタンクリックオブザーバー?

分類Dev

RxAndroid:シンプルなホットオブザーバブルを作成する

分類Dev

RxJavaとRxAndroidの組み合わせ?

分類Dev

RxAndroidフィルターObservable <List <Item >>

分類Dev

SubscribeOnとObserveOn間Rxandroid何の違い

分類Dev

単純なRxAndroidコードが機能しない

分類Dev

RxAndroidとマルチスレッド

分類Dev

Android:RxandroidとRetrofitを使用したNetworkOnMainThreadException

分類Dev

Retrofit2 + RxJava2 + RxAndroidエラー

分類Dev

RxAndroidチェーンアクション

分類Dev

RxAndroidでソートする方法

分類Dev

SwipeRefreshLayout&RxAndroid subscribeOn(AndroidSchedulers.mainThread())が機能しない

分類Dev

RxAndroid-サーバーの応答を待つ

分類Dev

RXJava / RxAndroidでの改造:Observableはどのように機能しますか?

分類Dev

RxAndroid:圧縮されたオブザーバブルを毎分出力する方法は?

分類Dev

RxAndroidでの進行状況のコールバック

分類Dev

RxAndroidオペレーターretryWhenが呼び出されましたが、再サブスクライブしません

分類Dev

RxAndroid MVPRetrofitでコールバックを変更する

分類Dev

iOSのRXAndroidに類似したライブラリはありますか

分類Dev

RxAndroidを使用してonKeyDownを処理する

分類Dev

Mobxオブザーバブルはオブザーバブルの変化に反応していません

分類Dev

RxAndroidの `Observable ... subscribe`がAndroidStudioで強調表示されます

分類Dev

RxJava / RxAndroid-複数のEditTextの変更を処理します

分類Dev

RxJavaとRxAndroid-両方が必要ですか?

分類Dev

RXAndroid:別の監視可能な完了を監視可能な待機

分類Dev

AndroidでRxAndroidのバグを修正する方法

Related 関連記事

  1. 1

    RxAndroidを使用してKotlin言語でいくつかのオブザーバブルを圧縮する方法

  2. 2

    RxAndroidの責任の連鎖

  3. 3

    RxJavaとRxAndroidの違いは?

  4. 4

    RxAndroidボタンクリックオブザーバー?

  5. 5

    RxAndroid:シンプルなホットオブザーバブルを作成する

  6. 6

    RxJavaとRxAndroidの組み合わせ?

  7. 7

    RxAndroidフィルターObservable <List <Item >>

  8. 8

    SubscribeOnとObserveOn間Rxandroid何の違い

  9. 9

    単純なRxAndroidコードが機能しない

  10. 10

    RxAndroidとマルチスレッド

  11. 11

    Android:RxandroidとRetrofitを使用したNetworkOnMainThreadException

  12. 12

    Retrofit2 + RxJava2 + RxAndroidエラー

  13. 13

    RxAndroidチェーンアクション

  14. 14

    RxAndroidでソートする方法

  15. 15

    SwipeRefreshLayout&RxAndroid subscribeOn(AndroidSchedulers.mainThread())が機能しない

  16. 16

    RxAndroid-サーバーの応答を待つ

  17. 17

    RXJava / RxAndroidでの改造:Observableはどのように機能しますか?

  18. 18

    RxAndroid:圧縮されたオブザーバブルを毎分出力する方法は?

  19. 19

    RxAndroidでの進行状況のコールバック

  20. 20

    RxAndroidオペレーターretryWhenが呼び出されましたが、再サブスクライブしません

  21. 21

    RxAndroid MVPRetrofitでコールバックを変更する

  22. 22

    iOSのRXAndroidに類似したライブラリはありますか

  23. 23

    RxAndroidを使用してonKeyDownを処理する

  24. 24

    Mobxオブザーバブルはオブザーバブルの変化に反応していません

  25. 25

    RxAndroidの `Observable ... subscribe`がAndroidStudioで強調表示されます

  26. 26

    RxJava / RxAndroid-複数のEditTextの変更を処理します

  27. 27

    RxJavaとRxAndroid-両方が必要ですか?

  28. 28

    RXAndroid:別の監視可能な完了を監視可能な待機

  29. 29

    AndroidでRxAndroidのバグを修正する方法

ホットタグ

アーカイブ