multithreading - 如何将 Retrofit 2 与 Realm 和 RxJava 结合起来

标签 multithreading realm rx-java retrofit2

我想在后台线程上保存对 Realm 的改造响应,然后将其传递给 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);
             }
        });

关于multithreading - 如何将 Retrofit 2 与 Realm 和 RxJava 结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35897737/

相关文章:

c# - VB/C#.net 动态添加带有Background Worker的控件项

ios - 如何使用 Objective C 在 Realm DB 中存储数组值 (RLMArray)?

java - Java/Android Realm - 保留查询/结果的状态

rx-java - 为什么 rxjava Observable.subscribe(observer) 返回 void?

java - 使 JavaFX 应用程序线程等待另一个线程完成

android - 为不同的线程创建数据库的构造函数

c - C语言的线程同步

ios - 将 Realm 结果映射到 JSON 标准格式

java - RxAndroid : UI changes on Schedulers. io() 线程

rx-java - 从 Observable 读取对象值