Как заполнить Android ListView информацией из запроса Firebase

Это мой первый пост, так что если я не буду следовать протоколу, который должен был принести извинения.

Я пытаюсь заполнить ListView некоторой информацией из моей базы данных Firebase. Я думаю, что проблема, с которой я столкнулся, заключается в том, что запрос к базе данных слишком медленный (поток, вероятно, загружает изображения), и моя деятельность загружает макет своей активности, не дожидаясь завершения выполнения потока. (Если я перейду к отладчику и подожду немного, я в конечном итоге увижу информацию, которую анализирую: имена пользователей, номера пользователей и изображения пользователей). Все, что я запрашивал, предполагает, что для этого мне нужно использовать AsyncTask. В отличие от использования потоковой блокировки или семафора, b / c AsyncTask является поточно-ориентированным.

Насколько я понимаю, запросы Firebase уже выполняются асинхронно; поэтому метод doInBackground для AsyncTask, который я «пытался» реализовать, кажется излишним. Кроме того, я немного смущен перегруженной подписью AsyncTask и вызовом: new someTask.execute («некоторые вещи в строке»).

Любые предложения о том, как я могу сделать это? Любая обратная связь очень ценится!

// Пожалуйста, игнорируйте незначительный отступ от вставки моего кода в

protected void onCreate(Bundle savedInstanceState) {
    ...
    new getFirebaseInfoTask();
}

private class getFirebaseInfoTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object... args) {
        // Do stuff
        userInfoList = GetUserInfoFromFirebase.getUserInfo();
        // Unsure if I need to return here.
        return userInfoList;
    }

    @Override
    protected void onProgressUpdate(Object... args) {
        // Update your UI here
        populateUserInfoList();
    }
}


private void populateUserInfoList() {
    // Create list of items
    Collections.addAll(userInfoList);
    populateFriendsListView();

}


private void populateFriendsListView() {
    // Build the adapter
    ArrayAdapter<UserInfo> adapter = new MyListAdapter();

    // Configure the list view
    ListView listView = (ListView) findViewById(R.id.friends_listview);
    listView.setAdapter(adapter);

    registerClickCallBack();
}

... // More code


public class GetUserInfoFromFirebase {

public static ArrayList getUserInfo() {
    final ArrayList<UserInfo> list = new ArrayList<UserInfo>();
    Firebase firebase = new Firebase("https:......firebaseio.com");
    firebase.child("users").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            HashMap<String, Object> users = (HashMap<String, Object>) snapshot.getValue();
            for(Object user : users.values()) {
                HashMap<String, Object> userMap = (HashMap<String, Object>) user;
                String userNumber = (String) userMap.remove("number");
                if(!list.contains(userNumber)) {
                    String name = (String) userMap.remove("username");
                    String pic = (String) userMap.remove("profile_picture");
                    UserInfo info = new UserInfo(userNumber, name, pic);
                    list.add(info);
                }
            }
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {}
    });
    return list;
}

Ответы на вопрос(3)

Ваш ответ на вопрос