2016-09-15 35 views
0

我使用TransactionHandler推送數據對象,因爲可能存在併發問題。但在這樣做,我收到以下異常:Android Firebase數據庫異常while runTransaction

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爲一個孩子和updateChildren工作良好。其他人面臨這種​​情況?

UPDATE:

的根本原因是,我發現,我用的是訂單POJO具有不聲明爲靜態的一個子類。我改變了這一點,並且一切都按預期工作。

回答

1

在您發佈的代碼中出現dataSnapshot.getRef()是代碼在偵聽器回調中運行的線索。假設收聽者位於X地址。當您撥打dataSnapshot.getRef().runTransaction()時,您正在請求位於X處的值的交易。該值爲您在doTransaction()回撥中獲得的MutableData。在doTransaction()回調中,您正在設置X的子元素的值,這也是對X本身的更改。這會導致偵聽器再次觸發。我懷疑這是導致堆棧溢出的循環。

另外,this answer提供瞭如何執行交易的詳細信息。這可能會有所幫助。

+0

嗨qbix,感謝您的回覆。但我發現,根本原因是所有在一起是不同的。我更新了這個問題。 –

0

對於進一步的讀者......我有我有我的 POJO裏面的方法問題稱爲getDBReference(),這是不是靜態的,返回的

DatabaseReference 

這個POJO實例。其中,然後在交易中被反射錯誤地檢測爲「添加」到交易並導致了StackOverFlow。

TL;博士

忘了註釋此方法@Exclude,這是問題。