2016-07-20 9 views
11

Firebase APIコールがいつ終了したかを知る上で問題があります。 Firebase documentationを読んだ後、私は、次を発見した:FirebaseがいつAPIコールを完了したかを知っていますか?

値イベントは常に最後にトリガされ、そのスナップショットが取られた前に発生した他のイベントからの更新を含むことが保証されています。

このことは、onChildAddedコールがすべて終了した後で、ValueEventListenerが呼び出されることを意味しています。その結果、私はonChildAdded関数にRecyclerViewを設定してからonSingleValueListenerを呼び出すことができたと思って、読み込み中の画面(この関数呼び出しの前にアニメートを開始しています)をアニメーション化して処理を完了できます。しかし、私はいくつかの慎重な文を入れて、私の場合はが呼び出され、Test 2が呼び出される前に呼び出されるという問題が発生しました。これは実際に私が望んだのとは逆の動作なので、問題を引き起こします。onChildAdded関数を終了してからonSingleValueListener関数を呼び出すと、Test 1が呼び出されます。これが起こっている理由がありますか?これはどうですか?私はなぜこれが起こっているのかについての説明に感謝します。ありがとう!

public void getComments(final String postId, final Activity activity, final View fragmentView, final View progressOverlay) { 
    final Firebase commentsRef = firebaseRef.child("/comments"); 
    Firebase linkRef = firebaseRef.child("/posts/" + postId); 
    linkRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      System.out.println("Test 1"); 
      if (progressOverlay.getVisibility() == View.VISIBLE) { 
       progressOverlay.setVisibility(View.GONE); 
       AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200); 
       fragmentView.findViewById(R.id.rv_view_comments).setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
    linkRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      commentsRef.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Comment comment = dataSnapshot.getValue(Comment.class); 
        System.out.println("Test 2"); 
        application.getCommentsRecyclerViewAdapter().getCommentsList().add(comment); 
        application.getCommentsRecyclerViewAdapter().notifyDataSetChanged(); 
       } 

       @Override 
       public void onCancelled(FirebaseError firebaseError) { 

       } 
      }); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

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

     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 
+0

"Firebase linkRef = firebaseRef.child("/posts/"+ postId);"私はあなたがレガシーFirebase APIを使用していると思います。私は正しい? –

+0

このドキュメントを参照し、新しいFirebaseデータベースAPIを試してみてください。 "https://firebase.google.com/docs/database/android/start/"; –

答えて

4

このコード"Firebase linkRef = firebaseRef.child("/posts/" + postId);"では、従来のFirebase APIを使用していることがわかりました。 廃止されました!

コードを新しいFirebase 3.x.x APIに親切に更新してください。

以下は2つの独立した非同期コールです。ユースケースに基づいて、リスナのどちらかを使用してデータを読み取ることができます。

1. linkRef.addListenerForSingleValueEvent(new ValueEventListener() {}); 
2. linkRef.addChildEventListener(new ChildEventListener() {}); 

ファイアベース文書を参照して、データベースリスナーの詳細を確認できます。 https://firebase.google.com/docs/database/android/retrieve-data

次のコードスニペットを使用すると、コメントリストを取得して入力することができます。

public void getComments(final String postId, final Activity activity, final View fragmentView, final View progressOverlay) { 
    DatabaseReference commentsRef = firebaseRef.child("/comments"); 
    DatabaseReference linkRef = commentsRef.child("/posts/" + postId); 
    linkRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // Iterate through data-snapshot, and update your Adapter dataset 
      for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
       Comment comment = snapshot.getValue(Comment.class); 
       application.getCommentsRecyclerViewAdapter().getCommentsList().add(comment); 
      } 
      application.getCommentsRecyclerViewAdapter().notifyDataSetChanged(); 

      // Dismiss your loading progressbar 
      if (progressOverlay.getVisibility() == View.VISIBLE) { 
       progressOverlay.setVisibility(View.GONE); 
       AndroidUtils.animateView(progressOverlay, View.GONE, 0, 200); 
       fragmentView.findViewById(R.id.rv_view_comments).setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // Handle fail case here 
     } 
    }); 

希望すると、これが役立ちます。あなたのGradleファイルであなたがFirebaseチームがFirebaseUI-のAndroidで利用可能にしていること**FirebaseRecyclerAdapter**クラスを使用することもできます

関連する問題