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) {
}
});
}
"Firebase linkRef = firebaseRef.child("/posts/"+ postId);"私はあなたがレガシーFirebase APIを使用していると思います。私は正しい? –
このドキュメントを参照し、新しいFirebaseデータベースAPIを試してみてください。 "https://firebase.google.com/docs/database/android/start/"; –