title: How to populate Android ListView with information from Firebase query
body: <p>This is my first post so if I didn't follow some protocol I was supposed to, apologies.</p>
  
  <p>I am trying to populate a ListView with some information from my Firebase database. I think the problem I am having is that the query to the database is too slow (the thread is probably downloading pictures) and my activity loads its activity layout without waiting for the thread to finish executing. (If I step through the debugger and wait a bit, I will eventually see the information I am parsing: user names, user numbers, and user pictures) Everything I have queried suggests I should use AsyncTask to accomplish this. As opposed to using thread blocking or a semaphore b/c AsyncTask is thread safe. </p>
  
  <p>To my understanding, Firebase queries are already executing asynchronously; therefore, the doInBackground method for AsyncTask I have "tried" to implement seems redundant. Also, I am a bit confused of AsyncTask's overloaded signature and the call to: new someTask.execute("some stuff in a string").</p>
  
  <p>Any suggestions on how I can accomplish this? Any feedback is very much appreciated!</p>
  
  <p>// Please ignore the minor indentation from pasting my code in</p>
  
  <pre><code>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&lt;UserInfo&gt; 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&lt;UserInfo&gt; list = new ArrayList&lt;UserInfo&gt;();
      Firebase firebase = new Firebase("https:......firebaseio.com");
      firebase.child("users").addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot snapshot) {
              HashMap&lt;String, Object&gt; users = (HashMap&lt;String, Object&gt;) snapshot.getValue();
              for(Object user : users.values()) {
                  HashMap&lt;String, Object&gt; userMap = (HashMap&lt;String, Object&gt;) 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;
  }
  </code></pre>