gpt4 book ai didi

java - Firebase 事务从不调用 onComplete()

转载 作者:行者123 更新时间:2023-11-29 03:12:37 25 4
gpt4 key购买 nike

在 Java 中使用 Firebase,我遇到了这样一种情况,我的 Transaction.Handler.onComplete() 似乎从未被调用过。

我试图等待特定事务的完成,所以我阻止调用线程前进,直到 onComplete() 被调用。这是由围绕现有 Transaction.Handler txn 的匿名装饰器完成的。

Transaction.Handler txn = ...
CountDownLatch latch = new CountDownLatch(1);

ref.runTransaction(new Transaction.Handler() {

@Override
public Transaction.Result doTransaction(MutableData data) {
return txn.doTransaction(data);
}

@Override
public void onComplete(FirebaseError e, boolean wasCommitted, DataSnapshot data) {
System.out.println("never printed");
txn.onComplete(e, wasCommitted, data);
if(e != null || !wasCommitted) {
System.out.println("error: " + e + ", committed: " + wasCommitted);
}
latch.countDown();
}

});

latch.await();
System.out.println("never printed");

doTransaction() 肯定至少完成一次 - 我可以在 Web 界面中看到数据更新 - 但 onComplete() 从未被调用,我们只是挂起。

我看不出这个包装器模式有什么问题:我在不同的 Firebase 上的测试 main() 方法和 onComplete() 中单独运行了相同的事务> 叫了。

是什么导致了这个挂起? Firebase 的配置(例如 auth?规则?)是否在此处引入了错误?

编辑

我在没有包装模式的情况下遇到了同样的问题。这是代码:

CountDownLatch latch = new CountDownLatch(1);
ref.runTransaction(new Transaction.Handler() {

@Override
public void onComplete(FirebaseError e, boolean b, DataSnapshot data) {
if(e != null || !b) {
System.out.println("error: " + e + ", committed: " + b);
}
System.out.println("transaction finished!");
latch.countDown();
}

@Override
public Result doTransaction(MutableData data) {
System.out.println("doing transaction");
data.child(...).setValue(...);
return Transaction.success(data);
}
});

latch.await();
System.out.println("never printed");

这导致打印 doing transaction 和 Firebase 中的数据更改(我通过 web UI 看到),但打印 transaction finished。它只是挂起。

最佳答案

在 Android 上,所有 Firebase 回调都在主线程上运行。如果在主线程调用latch.await()onComplete将永远没有机会运行,因为主线程被阻塞,导致死锁。

关于java - Firebase 事务从不调用 onComplete(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com