So füllen Sie Android ListView mit Informationen aus der Firebase-Abfrage

Dies ist mein erster Beitrag. Wenn ich also ein bestimmtes Protokoll nicht befolgt habe, entschuldige ich mich.

Ich versuche, eine ListView mit Informationen aus meiner Firebase-Datenbank zu füllen. Ich denke, das Problem, das ich habe, ist, dass die Abfrage an die Datenbank zu langsam ist (der Thread lädt wahrscheinlich Bilder herunter) und meine Aktivität das Aktivitätslayout lädt, ohne darauf zu warten, dass der Thread die Ausführung beendet. (Wenn ich durch den Debugger gehe und etwas warte, werden mir irgendwann die Informationen angezeigt, die ich analysiere: Benutzernamen, Benutzernummern und Benutzerbilder.) Alles, was ich abgefragt habe, legt nahe, dass ich AsyncTask verwenden sollte, um dies zu erreichen. Im Gegensatz zur Verwendung von Thread-Blocking oder Semaphor-B / C ist AsyncTask thread-sicher.

ach meinem Verständnis werden Firebase-Abfragen bereits asynchron ausgeführt. Aus diesem Grund scheint die Methode doInBackground für AsyncTask, die ich "versucht" habe, überflüssig zu sein. Außerdem bin ich etwas verwirrt über die überladene Signatur von AsyncTask und den Aufruf von: new someTask.execute ("some stuff in a string").

Vorschläge, wie ich das erreichen kann? Jedes Feedback wird sehr geschätzt!

// Bitte ignorieren Sie die kleinen Einrückungen, die beim Einfügen meines Codes in @ auftrete

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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage