如何结合 Retrofit 2 与 Realm 和 RxJava

How to combine Retrofit 2 with Realm and RxJava

我想在后台线程上保存对领域的改造响应,然后将其传递给 UI 线程,但这有点棘手,因为 Realm 对线​​程非常敏感。所以代码看起来像这样,请将您的编辑提交给所有更好的解决方案:)

restApi.userRealmList()
        .doOnNext(userRealmModels -> {
            if (userRealmModels != null){
                mRealm = Realm.getInstance(mContext);
                mRealm.asObservable()
                        .map(realm -> mRealm.copyToRealmOrUpdate(userEntity))
                        .subscribe(new Subscriber<Object>() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {
                                e.printStackTrace();
                            }

                            @Override
                            public void onNext(Object o) {
                                Log.d("RealmManager", "user added!");
                            }
                        });
            }})
        .map(userEntityDataMapper::transformAll)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<List<User>>() {
             @Override
             public void onCompleted() {
                 hideViewLoading();
             }

             @Override
             public void onError(Throwable e) {
                 hideViewLoading();
                 showErrorMessage(new DefaultErrorBundle((Exception) e));
                 showViewRetry();
             }

             @Override
             public void onNext(List<User> users) {
                 showUsersCollectionInView(users);
             }
        });

你的代码看起来不能编译?例如。什么是 userEntity。此外,您的 copyToRealmOrUpdate 不在事务内,因此也会崩溃,但它与线程无关。

如果您想在将数据发送到 UI 之前保存一些数据作为副作用,您应该能够执行以下操作:

restApi.userRealmList()
        .doOnNext(userRealmModels -> {
            if (userRealmModels != null) {
                Realm realm = Realm.getInstance(mContext);
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(userRealmModels);
                realm.commitTransaction();
                realm.close();
            }})
        .map(userEntityDataMapper::transformAll)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<List<User>>() {
             @Override
             public void onCompleted() {
                 hideViewLoading();
             }

             @Override
             public void onError(Throwable e) {
                 hideViewLoading();
                 showErrorMessage(new DefaultErrorBundle((Exception) e));
                 showViewRetry();
             }

             @Override
             public void onNext(List<User> users) {
                 showUsersCollectionInView(users);
             }
        });