Android 域异步事务执行后返回Completable
我使用的是Realm3.4和RxJava2。我想要完成的是在将数据插入领域后返回CompletableAndroid 域异步事务执行后返回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) {
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