Android 包装Firebase任务<;无效>;进入RxJava CompletableEmitter?

Android 包装Firebase任务<;无效>;进入RxJava CompletableEmitter?,android,firebase,google-cloud-firestore,rx-java,rx-java2,Android,Firebase,Google Cloud Firestore,Rx Java,Rx Java2,我试图将Firestore方法包装到CompletableEmitter中,以便能够在成功/完成时返回Completable.complete(),在失败时返回Completable.error()。 (该任务是更新集合中的文档(该文档中的1个字段)的Firestore操作) 是firestore方法我正试图包装成一个返回任务。下面是没有包装在完整表中的代码: public static Completable updateDocument(DocumentReference ref, Map&

我试图将Firestore方法包装到CompletableEmitter中,以便能够在成功/完成时返回Completable.complete(),在失败时返回Completable.error()。 (该任务是更新集合中的文档(该文档中的1个字段)的Firestore操作)

firestore方法
我正试图包装成一个返回
任务
。下面是没有包装在完整表中的代码:

public static Completable updateDocument(DocumentReference ref, Map<String,Object> fieldsAndValues){
    ref.update(fieldsAndValues)
                .addOnSuccessListener(aVoid -> {
                    Timber.d("SUCCESS");
                }).addOnCompleteListener(task -> {
                    Timber.d("COMPLETE");
                }).addOnFailureListener(e -> {
                    Timber.d("ERROR");
                });
        return Completable.complete();    //just for the sake of returning complete to finish the method...
}
publicstaticcompletableupdatedocument(documentref,Map字段和值){
参考更新(字段和值)
.addOnSuccessListener(避免->{
Timber.d(“成功”);
}).addOnCompleteListener(任务->{
木材d(“完整”);
}).addOnFailureListener(e->{
木材d(“错误”);
});
return Completable.complete();//只是为了返回complete来完成方法。。。
}
上面的代码按原样执行

下面是我尝试包装该代码的步骤:

public static Completable updateDocument(DocumentReference ref, Map<String,Object> fieldsAndValues){
    return Completable.create(emitter -> ref.update(fieldsAndValues)
       .addOnSuccessListener(aVoid -> emitter.onComplete())
       .addOnCompleteListener(task -> emitter.onComplete())
       .addOnFailureListener(emitter::onError));
}
publicstaticcompletableupdatedocument(documentref,Map字段和值){
返回Completable.create(发射器->参考更新(字段和值)
.addOnSuccessListener(避免->发射器.onComplete())
.addOnCompleteListener(任务->发射器.onComplete())
.addOnFailureListener(发射器::onError));
}
当第一个成功执行时(调用onSuccess,Firestore中的文档已更新),包装的代码从未从任务到达onSuccess(onSuccess从未到达,Firestore中的文档从未更新)。但它不会抛出任何错误,任务完成了,但永远不会成功


我不理解这种行为。有什么建议吗?我做错了什么?

您是否已
订阅
d返回completable?
ref.update()
将永远不会执行,除非您订阅它

updateDocument(...)
    .subscribe(...) // <- this
updateDocument(…)

.subscribe(…)/您不必为任务使用回调-我认为api在这个意义上是有限制的

您可以使任务阻塞,并在执行后对其进行评估,即

public static Completable updateDocument(DocumentReference ref, Map<String,Object> fieldsAndValues){
        return Completable.fromCallable(() -> {
            final Task<Void> task = ref.update(fieldsAndValues);
            Tasks.await(task);
            if(task.isSuccessful()) {
                return Completable.complete();
            } else {
                return Completable.error(new IllegalStateException("Task not successful", task.getException()));
            }
        });
    }
publicstaticcompletableupdatedocument(documentref,Map字段和值){
返回Completable.fromCallable(()->{
最终任务=参考更新(字段和值);
任务。等待(任务);
if(task.issusccessful()){
返回Completable.complete();
}否则{
返回Completable.error(新的IllegalStateException(“任务未成功”,Task.getException());
}
});
}
作为您最初的问题,尝试在闭包中保留对任务的引用,即

public static Completable updateDocument(DocumentReference ref, Map<String, Object> fieldsAndValues) {
        return Completable.create(emitter -> {
            final Task<Void> task = ref.update(fieldsAndValues)
            task.addOnSuccessListener(aVoid -> emitter.onComplete())
                    .addOnCompleteListener(task -> emitter.onComplete())
                    .addOnFailureListener(emitter::onError);
        });
    }
publicstaticcompletableupdatedocument(documentref,Map字段和值){
返回可完成。创建(发射器->{
最终任务=参考更新(字段和值)
task.addOnSuccessListener(避免->发射器.onComplete())
.addOnCompleteListener(任务->发射器.onComplete())
.addOnFailureListener(发射器::onError);
});
}

是的,我确实订阅了。从我所做的另一个类:disposable=FirebaseClass.updatedocument(ref,map).subscribeOn(…).observeOn(…).subscribe(this::onSuccess,this::onError)etchmm。。。请使用
doOnSubscribe
登录,或使用ref.update停止调试器,以检查它是否实际订阅。如果你真的在订阅,但它不起作用,这是可疑的。Firestore在默认情况下是异步工作的,所以Rx线程可能会有问题。我做了很多调试/日志记录,正如您所说,它看起来很可疑。事实证明,我完全忽略了这个问题,它既不是Firebase问题,也不是RxJava问题。看看@MarkKeen答案,第二部分。我必须在Completable表之外保留对我的任务的引用。不管怎样,谢谢你的回复,谢谢你的帮助,我投了赞成票。谢谢。听到这个消息我很高兴!这是有趣的一点。我完全忘了这是否是参考问题:P汉克斯马克。第二部分是正确的(并且对我的情况更有意义)。但是为什么呢?如果你有时间,你能解释一下吗?很高兴你的问题解决了。由于闭包不包含对返回的
任务
对象的引用,因此一旦它超出范围,就要进行垃圾收集。