Android 域异步事务执行后返回Completable

Android 域异步事务执行后返回Completable,android,rx-java2,realm-mobile-platform,Android,Rx Java2,Realm Mobile Platform,我使用的是Realm3.4和RxJava2。我想要完成的是在将数据插入领域后返回Completable public Completable insertSamplesRx(final List<Sample> sampleList) { realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) {

我使用的是Realm3.4和RxJava2。我想要完成的是在将数据插入领域后返回Completable

public Completable insertSamplesRx(final List<Sample> sampleList) {
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            for(Sample s : sampleList) {
                realm.insertOrUpdate(sampleList);
            }
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            Completable.complete();
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            Completable.error(error);
        }
    });
}
public Completable insertSamplesRx(最终列表sampleList){
realm.executeTransactionAsync(新realm.Transaction(){
@凌驾
公共void执行(领域){
对于(样本s:样本列表){
realm.insertOrUpdate(样本列表);
}
}
},new Realm.Transaction.OnSuccess(){
@凌驾
成功时的公共无效(){
Completable.complete();
}
},新的Realm.Transaction.OnError(){
@凌驾
公共无效onError(可丢弃错误){
可完成。错误(error);
}
});
}
这段代码显然无法编译,因为缺少返回。我如何在这里返回完整的结果


谢谢

请务必记住,在调用
subscribe
之前,Rx对象通常不会执行任何操作


您应该深入了解如何将“操作”转换为可完成或导致错误的可完成表。

对于可能涉及的人来说,解决方案是使用from action,它在出现错误时引发异常,并强制可完成表触发错误

 public Completable insertSamples(final List<Sample> sampleList) {
    return  Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            realm = Realm.getDefaultInstance();
            realm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    realm.insertOrUpdate(sampleList);
                }
            });
        }
    });
}
public Completable insertSamples(最终列表sampleList){
返回Completable.fromAction(新操作(){
@凌驾
public void run()引发异常{
realm=realm.getDefaultInstance();
realm.executeTransactionAsync(新realm.Transaction(){
@凌驾
公共void执行(领域){
realm.insertOrUpdate(样本列表);
}
});
}
});
}
需要注意的是,需要显式调用realm实例,以避免发生错误

java.lang.IllegalStateException:来自错误线程的域访问。领域对象只能在创建它们的线程上访问

希望这能对你有所帮助

public Completable updateChangeSancions(int resultId,int inspetionId, int sanction) {
    return Completable.fromAction(() -> {
        try (Realm r = Realm.getDefaultInstance()) {
            r.executeTransaction(realm -> {
                RealmResults<InspeccionDetalle> detalles = realm.where(Inspection.class)
                        .equalTo("resultId", 1)
                        .equalTo("inspetionId", resultId)
                        .findAll();

                for (InspeccionDetalle i : detalles) {
                    i.setPersonalSancios(sanction);
                }
            });
        }
    });
}
public Completable updateChangeSancions(int resultId、int inspectionid、int制裁){
返回Completable.fromAction(()->{
try(Realm r=Realm.getDefaultInstance()){
r、 executeTransaction(领域->{
RealmResults detalles=realm.where(Inspection.class)
.equalTo(“结果”,1)
.equalTo(“inspectionid”,resultId)
.findAll();
适用于(Inspeciondelle i:detalles){
i、 setPersonalSancios(制裁);
}
});
}
});
}

我们可以为Realm创建Kotlin扩展函数

fun Realm.completableTransaction(
    transactionBlock: (realm: Realm) -> Unit
): Completable {
    return Completable.create { completable ->
        this.executeTransactionAsync(
            Realm.Transaction { transactionRealm: Realm -> transactionBlock(transactionRealm) },
            Realm.Transaction.OnSuccess { completable.onComplete() },
            Realm.Transaction.OnError { t: Throwable -> completable.onError(t) }
        )
    }
}
用这样的东西

fun save(foo: RealmFoo): Completable {
    return realm.completableTransaction { _realm->
       foo.name = "bar" 
       _realm.copyToRealmOrUpdate(fooList)
    }
}
这仅在订阅时有效

save(foo)
.subscribe({
    // saved
},{
    // error
})

是的,我想为此返回一个Completable,这样无论是谁调用这个方法都将负责订阅Completable事件,我也将查看create。我认为这里的“问题”是onsuccess和onerror回调返回void,因此我认为需要类似flatmap的东西。但我对这些概念很陌生,所以可能我错了。等待一些rx专家:DCombining
fromAction
和任何异步操作都将导致在实际执行操作之前完成completable,因为不会引发异常。我不理解下一票:我测试了用例,如果realm事务失败,观察器将正确接收onError,onSuccess否则。当使用Completable.create时,不返回subscribe