programing

Firebase의 childEventListener가 모든 데이터 로드를 완료했는지 확인합니다.

linuxpc 2023. 7. 20. 21:45
반응형

Firebase의 childEventListener가 모든 데이터 로드를 완료했는지 확인합니다.

Firebase Realtime Database를 사용하여 Android 응용 프로그램의 데이터를 저장하고 검색하고 있습니다.활동 중에 다음을 사용하여 Firebase에서 모든 데이터(예: 사용자 데이터 목록)를 검색합니다.childEventListener.

데이터베이스에서 데이터가 완전히 검색되지 않은 경우 진행률 표시줄을 표시합니다.데이터가 로드된 후 진행 표시줄을 닫을 수 있도록 모든 데이터가 완전히 검색되었는지 확인하려면 어떻게 해야 합니까?

Firebase가 지정된 위치에서 초기 데이터 동기화가 완료된 경우를 탐지하는 일반적인 방법이 있습니다.이 접근 방식은 Firebase 이벤트 보증 중 하나를 사용합니다.

값 이벤트는 항상 마지막으로 트리거되며 스냅샷이 생성되기 전에 발생한 다른 이벤트의 업데이트가 포함됩니다.

그래서 만약 당신이 둘다 가지고 있다면,ValueEventListener그리고 aChildEventListener주어진 위치에서,ValueEventListener.onDataChange()모든 것이 끝난 후에 호출될 것이 보장됩니다.onChildAdded()전화가 왔습니다.이를 통해 초기 데이터 로드가 완료된 시점을 알 수 있습니다.

ref.addListenerForSingleValueEvent(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("We're done loading the initial "+dataSnapshot.getChildrenCount()+" items");
    }
    public void onCancelled(FirebaseError firebaseError) { }
});
ref.addChildEventListener(new ChildEventListener() {
    public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
        System.out.println("Add "+dataSnapshot.getKey()+" to UI after "+previousKey);
    }
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    }
    public void onChildRemoved(DataSnapshot dataSnapshot) {
    }
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    }
    public void onCancelled(FirebaseError firebaseError) { }
});

테스트 실행 결과:

Add -K2WLjgH0es40OGWp6Ln to UI after null
Add -K2YyDkM4lUotI12OnOs to UI after -K2WLjgH0es40OGWp6Ln
Add -K2YyG4ScQMuRDoFogA9 to UI after -K2YyDkM4lUotI12OnOs
...
Add -K4BPqs_cdj5SwARoluP to UI after -K4A0zkyITWOrxI9-2On
Add -K4BaozoJDUsDP_X2sUu to UI after -K4BPqs_cdj5SwARoluP
Add -K4uCQDYR0k05Xqyj6jI to UI after -K4BaozoJDUsDP_X2sUu
We're done loading the initial 121 items

그래서 당신은 그것을 사용할 수 있습니다.onDataChanged()진행률 표시줄을 숨기기 위한 이벤트입니다.

하지만 한 가지 명심해야 할 것이 있습니다.파이어베이스는 데이터만 로드하는 것이 아닙니다.서버에서 연결된 모든 클라이언트로 데이터를 지속적으로 동기화합니다.따라서 데이터가 완전히 검색되는 순간은 없습니다.

저는 그것을 아주 간단한 방법으로 했습니다.나는 int 카운트를 허용한 다음 함수 안으로 들어올 때마다 그것을 증분하고 그것이 총 자식 수와 같은지 확인합니다. 만약 그것이 같다면 당신은 진행 표시줄을 멈출 수 있습니다.

    int count = 0;    
    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            count++;


            if(count >= dataSnapshot.getChildrenCount()){
                //stop progress bar here
            }
        }

사용하다

  totalChilds = 0; 
  ref..addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    totalChilds = dataSnapshot.getChildrenCount();
                    ref.addChildEventListener(new ChildEventListener() {
                           @Override
                           public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                           count++;
                           if(count >= totalChilds){
                                 progressDialog.dismiss();
            }
            @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

언급URL : https://stackoverflow.com/questions/34530566/find-out-if-childeventlistener-on-firebase-has-completed-loading-all-data

반응형