2017-01-28 8 views
0

フラグメントがある場合、フラグメントが開始されたときにfirebaseのリアルタイムデータベースを照会する必要があります。 onCreateメソッドが実行されたときにデータベース接続コードを直接追加していますが、トーストを印刷するときにnullが返されます。クラス作成時にデータベースからデータを取得

@Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
          @Nullable Bundle savedInstanceState) { 
     View r = inflater.inflate(R.layout.friends, container, false); 


     FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
     FirebaseUser user = mAuth.getCurrentUser(); 
     FirebaseDatabase db = FirebaseDatabase.getInstance(); 

     String userEmail = user.getEmail(); 

     DatabaseReference userDetails = db.getReference("users").child(userEmail); 

     userDetails.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       myUser = dataSnapshot.getValue(User.class); 
       postCount = myUser.getTotalPosts(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 



     Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show(); 

だから、クラスが

static{ 
// everything in here from above code excluding the toast 
} 

に作成されたとき、これは最初に実行する必要がありますので、私は、私は、すべてのデータベース接続をラップしようとした静的ブロック内のコードを取得してなかった何私は、postCountを印刷しようとした再びonCreateView()の内部にありますが、postCountがnullの場合と同じ結果が得られます

これをどのように克服できますか?私は私が聞いていたノードがデータベース

+0

設定されているときにこの値を使用する必要があります。明らかにそれはondatachangeの中に設定されています – Selvin

答えて

1

に存在する。これは、addListenerForSingleValueEventは別のオフUIスレッド(バックグラウンドスレッド)に取り組んでいると、あなたのToast.makeText(...)が取り組んでいるというだけの理由であることを確信している

おかげ

PS UIスレッド。

したがって、Toast.makeText(..)の実行は、postCountの値が更新される前でも実行されます。したがって、Toast.makeText()では、postCountのデフォルト値が得られます。

はあなたのOnDataChangeの方法で

Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show(); 

を書くことができ、これを削除します。

例:明らかに

@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
myUser = dataSnapshot.getValue(User.class); 
postCount = myUser.getTotalPosts(); 
Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show(); 
} 
+0

感謝します、私は呼び出しが非同期であったことを知りませんでした – memoryManagers

関連する問題