2016-06-03 8 views
0

리스너 단일 값 이벤트를 설정하려고하는데 일반적으로 작동합니다. (새로 고침을 위해이 작업을 수행합니다. 앱을 종료하고 다시 열어도 작동합니다. 또는 Android 시스템에서 백그라운드에서 메모리를 회수하도록 할 수도 있습니다.)Firebase가 때때로 데이터베이스를 호출하지 않습니다.

아마도 특정 시간 (몇 시간) 후에 앱으로 돌아가서 액세스하려고하면 아래 코드가 더 이상 실행되지 않습니다. 그리고 그것은이 작동 불가능한 상태에 있습니다 (그러나 나는 모든 것이 거기에 있음을 확인합니다). 기본적으로 로그 아웃하고 다시 로그인 할 때까지 지속됩니다.

로그온을 onDataChange 메소드에 넣었지만 실행되지 않습니다. 나는 그것을 그것의 바깥쪽에 넣었다. 그리고 그것은 발화한다.

  FirebaseDatabase.getInstance() 
       .getReference() 
       .child(context.getString(R.string.firebase_jobs)) 
       .child(userId). 
       addListenerForSingleValueEvent(
         new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           for (DataSnapshot jobSnapShot : dataSnapshot.getChildren()) { 
            JobItem jobItem = jobSnapShot.getValue(JobItem.class); 
            // Add the ID into the jobItem 
            jobItem.setId(dataSnapshot.getKey()); 

            // Set the jobItem 
            arrayList.add(jobItem); 
            subscriber.onNext(jobItem); 
           } 
          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 
           Log.e(TAG, "onCancelled: " + databaseError.getMessage()); 
          } 
         }); 
    } 

이 사람이 가끔 코드에서 호출 할 수없는 경우의 코드가 발생했습니다 : 여기

내 코드? 감사!

편집 : 나는 그것의 발사와 내가 로그 오류 메시지가 나타납니다 동안 로그 아웃을 시도 :

E/FirebaseRetrieveData: onCancelled: Permission denied 

가 그래서 일이 발사되어

은, 그냥 다시 데이터를 얻을하는 데 시간이 오래 걸리는을 ... 만약 그렇다면!

답변

1

의도 된 동작은 addListenerForSingleValueEvent()입니다. 문서에서 설명하는 바와 같이 :

한 번 트리거되고 다시 트리거되지 않습니다.

뭔가 다른 것을 목표로하지 않는 한? 나는 당신의 포스트에서 무언가를 오해 했습니까? 특정 단일 가치를 듣기 만하면 되는가? 그렇다면 addValueEventListener() 대신 사용해야한다고 생각합니다.

편집 :

이런 경우에 다른 사람이를 참조하십시오. 다음은 addListenerForSingleValueEvent()에 대한 최신 문서 링크입니다.

+0

음 ... 죄송합니다. 한 번 트리거하면 괜찮습니다. 나는 새로 고침을 당긴다. 그리고 그것은 잘 발동한다. 응용 프로그램을 종료하고 백그라운드에서 실행되도록두고 시스템에서 메모리를 회수 (강제 종료)하고 다시 시작하면 계속 작동합니다. 그러나 나는 몇 시간 후에 내 전화를 떠나 다시 돌아오고 더 이상 방아쇠를 당길 수없는 것처럼 보이지 않으며 트리거 할 수없는 상태에 처하게됩니다. 그게 문제 야. – lawonga

+1

예. 그것이'addListenerForSingleValueEvent()'의 의도 된 동작입니다. 그것은 한 번만 트리거하고, 더 이상은 트리거하지 않습니다. 특정 참조/자식에 대한 모든 이벤트를 수신하려면 'addValueEventListener()'를 사용해야합니다. –

+0

아, 그래 ... 말이 되네. Firebase 문서는 (어쨌든 나에게) 때때로 오도하는 것 같다. 고마워, 시도 할 것이다! – lawonga

관련 문제