2016-09-15 2 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으로 만 제공됩니다. 그러나 어린이가 setValue이고 updateChildren이 잘 작동합니다. 다른 사람이이 시나리오에 직면 했습니까?

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이 메소드 주석 깜빡하는 문제가 있었다.

관련 문제