Como preencher o Android ListView com informações da consulta Firebase

Este é o meu primeiro post, por isso, se eu não seguisse algum protocolo que deveria, peço desculpas.

Estou tentando preencher um ListView com algumas informações do meu banco de dados Firebase. Acho que o problema que estou tendo é que a consulta ao banco de dados é muito lenta (o encadeamento provavelmente está baixando imagens) e minha atividade carrega seu layout de atividade sem aguardar a conclusão da execução do encadeamento. (Se eu percorrer o depurador e esperar um pouco, acabarei vendo as informações que estou analisando: nomes de usuários, números de usuários e fotos de usuários) Tudo o que consultamos sugere que eu deveria usar o AsyncTask para fazer isso. Ao contrário do uso de bloqueio de thread ou de um semáforo, o AsyncTask é seguro para threads.

Para meu entendimento, as consultas do Firebase já estão sendo executadas de forma assíncrona; portanto, o método doInBackground para AsyncTask que "tentei" implementar parece redundante. Além disso, estou um pouco confuso com a assinatura sobrecarregada do AsyncTask e a chamada para: new someTask.execute ("algumas coisas em uma string").

Alguma sugestão de como posso fazer isso? Qualquer feedback é muito apreciado!

// Por favor, ignore o recuo menor de colar meu código em

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;
}

questionAnswers(3)

yourAnswerToTheQuestion