2016-09-15 4 views
0

TransactionHandlerを使用してデータオブジェクトをプッシュすると、同時性の問題が発生する可能性があります。runTransaction中のAndroid Firebaseデータベース例外

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とだけ受け取ります。しかし、子供の場合はsetValueupdateChildrenの場合はうまくいきます。誰かがこのシナリオに直面しましたか?

UPDATE:

私が見つけた根本的な原因は、私が使っていた注文POJOがstaticとして宣言されていないサブクラスを持っている、ということです。私はそれを変更し、すべてが期待どおりに動作しています。

答えて

1

あなたが投稿したコードのdataSnapshot.getRef()の外観は、コードがリスナーコールバック内で実行されているという手掛かりです。リスナーがX位置にあるとします。dataSnapshot.getRef().runTransaction()を呼び出すと、位置Xの値でトランザクションを要求しています。この値は、doTransaction()コールバックで取得したMutableDataです。 doTransaction()コールバックでは、X自体の変更でもあるXの子の値を設定しています。これにより、リスナーは再び起動します。私はそれがスタックのオーバーフローを引き起こしているループだと思う。

また、this answerは、トランザクションの実行方法の詳細を提供します。それは役に立つかもしれません。さらに読者のために

+0

こんにちはqbix、返信いただきありがとうございます。しかし、私は根本的な原因がすべて一緒に異なることが分かった。私は質問を更新しました。 –

0

...私は静的ではありませんでした、私は私の POJOの内部メソッドを持っていた問題getDBReference()と呼ばれるが、持っていたし、このPOJOインスタンスに

DatabaseReference 

を返しました。その後、トランザクションでは、リフレクションによってトランザクションに誤って検出され、トランザクションに「追加」され、StackOverFlowが発生しました。

TL; DR

は、私が問題だったこと、@Excludeでこのメソッドに注釈を付けるのを忘れていました。

関連する問題