2017-02-11 7 views
3

Я работаю над приложением android, используя Firebase и Android Studio. У меня возникли проблемы с извлечением значений с помощью прослушивателей событий значения, потому что я не мог установить значения внутри метода onDataChange, который будет использоваться иначе, потому что он выполняется асинхронно, поэтому слушатель может выполнить или не выполнить свою задачу до того, как значение потребуется снаружи. Поэтому я решил эту проблему, поставив все, что нужно сделать в методе onDataChange (реальная спасательная игра!).Когда я гнезду двух слушателей событий значения, они оба запускаются асинхронно или нижний ожидает завершения более высокого?

Но

значение я извлечения в onDataChange также бывает необходимо внутри другого слушателя. как этот

DatabaseReference mLastnameReference = rootRef.child("users").child("12345678").child(phone); 
     ValueEventListener lastnameListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       try { 
        yourid = dataSnapshot.getValue().toString(); 
       } 
       catch (NullPointerException e){ 
        //handle user not registered here 

       } 



DatabaseReference mBioReference = FirebaseDatabase.getInstance().getReference().child("users").child(yourid).child("status"); 
       ValueEventListener bioListener = new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         Status = dataSnapshot.getValue().toString(); 
         mTextField = (TextView) findViewById(R.id.status); 
         mTextField.setText(Status); 

        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }; 
       mBioReference.addValueEventListener(bioListener); 
} 
      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }; 
     mLastnameReference.addValueEventListener(lastnameListener); 

значение им ждать в первом слушателя yourid. Мне также нужно это значение, чтобы получить ссылку на базу данных для узла для запуска вложенного прослушивателя. Но когда я запускаю этот код, оба они работают одновременно. Следовательно, получение нулевого исключения в вложенной ссылке на базу данных, потому что в этот момент не удалось получить идентификатор пользователя.

ответ

2

В коде, который вы поделили, будет прочитано значение users/12345678/$phone, прежде чем вы присоедините вложенного слушателя. Но значение может быть нулевым, что ваш код не обрабатывает правильно:

DatabaseReference mLastnameReference = rootRef.child("users").child("12345678").child(phone); 
ValueEventListener lastnameListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String id = String.valueOf(dataSnapshot.getValue()); 
     if (id != null) { 
      DatabaseReference mBioReference = FirebaseDatabase.getInstance().getReference().child("users").child(id).child("status"); 
      ValueEventListener bioListener = new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Status = dataSnapshot.getValue(String.class); 
        mTextField = (TextView) findViewById(R.id.status); 
        mTextField.setText(Status); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        throw databaseError.toException(); 
       } 
      }; 
      mBioReference.addValueEventListener(bioListener); 
     } 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); 
    } 
}; 
mLastnameReference.addValueEventListener(lastnameListener); 

Я заменил try - catch с регулярным if и сделал id локальные переменный, которая удаляет вероятность того, что какая-либо другая часть вашего кода устанавливает его на null. Это также исключает исключения из onCancelled, так как лучше не игнорировать эти проблемы с авторизацией.