Это мой первый пост, поэтому, если я не следовал какому-то протоколу, который должен был, приношу свои извинения.
Я пытаюсь заполнить 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;
}