【问题标题】:Android Firebase Database Exception while runTransactionrunTransaction 时 Android Firebase 数据库异常
【发布时间】:2017-01-23 14:16:28
【问题描述】:

我正在使用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 期间确实搜索过此异常,但找不到任何异常。下面是我得到这个异常的代码sn-p:

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 得到这个。但是对于孩子的setValueupdateChildren 运行良好。其他人面临这种​​情况?

更新:

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

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

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

    【讨论】:

    • 嗨qbix,感谢您的回复。但我发现,根本原因是不同的。我更新了问题。
    【解决方案2】:

    对于更多的读者......我遇到的问题是我的内部有一个方法 POJO调用getDBReference(),它不是静态的,返回的是

    DatabaseReference
    

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

    tl;博士

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-06
        相关资源
        最近更新 更多