2017-01-28 21 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 имеет значение

Как преодолеть это?

благодаря

PS Я уверен, что узел я прослушивает существует в базе данных

+0

Очевидно, что вы должны использовать это значение, когда установлено. Очевидно, что он установлен внутри ondatachange – Selvin

ответ

1

Это просто потому, что addListenerForSingleValueEvent работает над другой от потока пользовательского интерфейса (фоновый поток), и ваш Toast.makeText(...) работает над Пользовательский интерфейс.

Таким образом, выполнение Toast.makeText(..) происходит еще до обновления значения postCount. Таким образом, в Toast.makeText() вы получаете значение postCount по умолчанию.

Для удаления этого вы можете написать

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

в вашем методе OnDataChange.

например:

@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