2016-02-26 5 views
2

Я новичок в Firebase и работаю над простым проектом. У меня есть способ получить список учителей из Firebase и добавить их письма в ArrayList и вернуться.Дождитесь завершения onChildДобавлено в запросах firebase, Android

public ArrayList<String> getTeacherList() { 
    temp = new ArrayList(); 

    Firebase node = ref.child("teachers"); 
    Query query = node.orderByChild("subject").equalTo(selected_subject); 

    query.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      Map<String,Object> value = (Map<String, Object>) dataSnapshot.getValue(); 
      Log.d("TEACHER"," "+value.toString()); 

      Iterator entries = value.entrySet().iterator(); 
      while (entries.hasNext()) { 
       Map.Entry thisEntry = (Map.Entry) entries.next(); 
       String key = (String) thisEntry.getKey(); 
       Object data = thisEntry.getValue(); 

       if(key.equals("email")) { 
        temp.add(data.toString()); 
        Log.d("ENTRY",": DATA "+data.toString()); 
       } 
      } 

     } 

     @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) { 

     } 
    }); 


    Log.d("RETURN", temp.toString()); 
    return temp; 
} 

Этот метод работает нормально. Но проблема в том, что это возвращает переменную temp перед тем, как завершить добавление дочернего элемента.

Например мой Android Monitor такова:

D/RETURN: []

D/УЧИТЕЛЬ: {число = 1, имя = Учитель, [email protected], Заголовок = Физика}

D/ENTRY:: DATA [email protected]

есть ли способ ждать до завершения, что onChildAdded способ ..?

================================================================================================================================== ===========================

Я так же старался. Но потом он остановился внутри метода.

Даже не отправился Log.d("TEACHER", " " + value.toString()); бирка здесь.

public ArrayList getTeacherList() throws InterruptedException { 
    temp = new ArrayList(); 

    Firebase node = ref.child("teachers"); 
    Query query = node.orderByChild("subject").equalTo(selected_subject); 

    semaphore = new Semaphore(0); 

    query.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      Map<String, Object> value = (Map<String, Object>) dataSnapshot.getValue(); 
      Log.d("TEACHER", " " + value.toString()); 

      Iterator entries = value.entrySet().iterator(); 
      while (entries.hasNext()) { 
       Map.Entry thisEntry = (Map.Entry) entries.next(); 
       String key = (String) thisEntry.getKey(); 
       Object data = thisEntry.getValue(); 

       if (key.equals("email")) { 
        setArrayList(data.toString()); 
        Log.d("ENTRY", ": DATA " + data.toString()); 
       } 
      } 
      semaphore.release(); 
     } 

     @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) { 

     } 
    }); 
    semaphore.acquire(); 
    return temp; 
} 
+0

Ожидание асинхронной работы - это отходы нити. Но если вы настаиваете: мой ответ здесь покажет вам оба варианта: http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

+0

Сэр, я прочитал ваше сообщение и попробовал в вашем путь. Но это не помогло мне. После вызова этого метода программа не обрабатывалась. какие-либо предложения..? –

+0

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

ответ

1

Решено: Я использовал Отто EventBus библиотеку из http://square.github.io/otto/, и она работала для меня

+0

Любые объяснения, как вы использовали автобус событий? Мне в такой же ситуации приходится ждать, пока все вызовы будут возвращены. –

+0

. Ответьте на этот ответ: [Answer Below] (http://stackoverflow.com/a/38542796/4882204) –

2
public class MainActivity extends AppCompatActivity{ 
public static Bus bus; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    bus = new Bus(ThreadEnforcer.MAIN); 
    bus.register(this); 

    //CALL TO LOAD DATA FROM FIREBASE 
    loadData(); 
} 

private void loadData(){ 
    DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
    mDatabase.child("my-data").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      //CREATE YOUR OWN OBJECT USING RECEIVED DATA 
      MyObject o = new MyObject(); 
      //CALL FOR METHOD nextMethod() 
      bus.post(o); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.d("Error", databaseError.toString()); 
     } 
    }); 
} 

@Subscribe 
private void nextMethod(MyObject o){ 

} 
} 

Это очень простой пример для использования OTTO - EventBus. От bus.post(o), вы можете позвонить на relavant Подписанный метод.

+0

Спасибо за ваше время, но как вы узнаете, когда все обратные вызовы закончены? этот код будет запускать событие каждый раз, когда вы получаете обратный вызов для каждого узла в своем местоположении в firebase. Я ищу что-то, о чем я получаю уведомление, когда все обратные вызовы дочерних узлов - rcvd. –

 Смежные вопросы

  • Нет связанных вопросов^_^