Comment faire pour remplir Android ListView avec des informations de Firebase requête

Ceci est mon premier post donc si je n'ai pas suivi un protocole que je devais le faire, toutes mes excuses.

Je suis en train de remplir une ListView avec quelques informations de mon Firebase base de données. Je pense que le problème que j'ai, c'est que la requête à la base de données est trop lent (le fil est probablement le téléchargement de photos) et mon activité charges de son activité de mise en page, sans attendre que le thread pour terminer l'exécution. (Si je fais un pas de travers le débogueur et attendre un peu, je vais finir par voir les informations je suis d'analyse: les noms d'utilisateur, les numéros d'utilisateur, et l'utilisateur photos) Tout ce que j'ai interrogé suggère que je devrais utiliser AsyncTask pour accomplir cette tâche. Par opposition à l'aide de blocage du thread ou un sémaphore b/c AsyncTask est thread-safe.

À ma connaissance, Firebase requêtes sont déjà en cours d'exécution en mode asynchrone; par conséquent, la méthode doInBackground pour AsyncTask j'ai "essayé" de mettre en œuvre semble redondant. Aussi, je suis un peu confus de AsyncTask surchargé de la signature et de l'appel à: nouvelle someTask.execute("des trucs dans une chaîne de caractères").

Des suggestions sur comment je peux accomplir cela? Tout commentaire est très apprécié!

//S'il vous plaît ignorer le mineur indentation de coller mon code dans

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;
}
J'ai donc pensé à elle. Je me suis débarrassé de l'AsyncTask et déplacé à l'appel de la méthode que je voulais exécuter dans onProgressUpdate à l'extérieur de la boucle de mon onDataChange tels que le thread qui est de l'accès à la onDataChange méthode appelle mon populateFriendsView méthode.
Bon d'entendre que vous avez compris et merci pour le compte rendu. Pouvez-vous fournir cette information comme une réponse (vous pourriez avoir à attendre un peu avant que vous êtes autorisé à le faire)? Vous pouvez également accepter votre propre réponse, ce qui contribue à la construction de votre score de réputation.
Merci pour les commentaires @FrankvanPuffelen.
Firebase a aussi un OS lib qui permet d'automatiser le remplissage de ListView: github.com/firebase/firebaseui-android

OriginalL'auteur cshort12 | 2014-12-11