runTransaction时Android Firebase数据库异常

时间:2016-09-15 13:59:57

标签: android firebase firebase-realtime-database

我使用df <- structure(list(ID = 1:10, State = c("A", "A", "B", "B", "B", "A", "A", "A", "C", "C")), .Names = c("ID", "State"), class = "data.frame", row.names = c(NA, -10L)) 来推送数据对象,因为可能存在并发问题。但在这样做时,我得到以下例外:

TransactionHandler

我在09-15 19:12:20.193 3196-3196/com.teja.twaters D/com.teja.twaters.utils.FirebaseUtil: isComplete - false 09-15 19:12:20.207 3196-3196/com.teja.twaters D/com.teja.twaters.utils.FirebaseUtil: databaseError - DatabaseError: User code called from the Firebase Database runloop threw an exception: java.lang.StackOverflowError: stack size 1037KB at java.lang.reflect.Method.invoke(Native Method) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) at com.google.android.gms.internal.zzaln.zzbw(Unknown Source) at com.google.android.gms.internal.zzaln.zzcd(Unknown Source) at com.google.android.gms.internal.zzaln$zza.zzce( 期间搜索了此异常,但找不到任何异常。下面是我得到此异常的代码片段:

runTransaction

});

我只能使用dataSnapshot.getRef().runTransaction(new Transaction.Handler() {
 @Override
 public Transaction.Result doTransaction(MutableData mutableData) {
 mutableData.child(order.getId() + "").setValue(order);
 return Transaction.success(mutableData);
 }

 @Override
 public void onComplete(DatabaseError databaseError, boolean isComplete, DataSnapshot dataSnapshot) {
 logger.debug("isComplete - " + isComplete);
 if(isComplete){
 logger.debug("dataSnapshot - " + dataSnapshot);
 callback.onSuccess(IConstants.USER_ORDER_SAVED); } else {
 logger.debug("databaseError - " + databaseError);
 callback.onSuccess(IConstants.USER_ORDER_SAVE_FAILED);
 }
 } 获得此功能。但runTransaction对于孩子而言setValue正在发挥作用。有人遇到过这种情况吗?

更新

我发现的根本原因是,我使用的订单POJO有一个未声明为静态的子类。我改变了,一切都按预期工作。

3 个答案:

答案 0 :(得分:1)

您发布的代码中dataSnapshot.getRef()的出现是代码在侦听器回调中运行的线索。假设侦听器位于X位置。当您呼叫dataSnapshot.getRef().runTransaction()时,您正在请求位置X处的值的事务。该值是您在MutableData回调中获得的doTransaction()。在doTransaction()回调中,您设置的是X子项的值,这也是对X本身的更改。这会导致听众再次开火。我怀疑这是导致堆栈溢出的循环。

此外,this answer提供了如何执行事务的详细信息。它可能会有所帮助。

答案 1 :(得分:0)

对于进一步的读者......我遇到的问题是我有一个方法 POJO称为getDBReference(),它不是静态的并返回

DatabaseReference

到这个POJO实例。其中,然后在事务中被反射错误地检测到“添加”到事务并导致StackOverFlow。

TL;博士

我忘了用@Exclude注释这个方法,这就是问题所在。

答案 2 :(得分:0)

如果您在多个位置调用FirebaseDatabase.getInstance(),则会发生这种情况。您应该创建它的单例实例,然后在整个项目中使用它。 示例:

公共类FirebaseUtils { 私有静态FirebaseDatabase mDatabase;

public static FirebaseDatabase getDatabase() {
    if (mDatabase == null) {
        mDatabase = FirebaseDatabase.getInstance();

    }
    return mDatabase;
} }

并获取数据库FirebaseUtils.getDatabase();