【发布时间】:2014-12-11 02:23:50
【问题描述】:
这是我的第一篇文章,所以如果我没有遵守我应该遵守的一些协议,请道歉。
我正在尝试使用我的 Firebase 数据库中的一些信息填充 ListView。我认为我遇到的问题是对数据库的查询太慢(线程可能正在下载图片)并且我的活动加载其活动布局而无需等待线程完成执行。 (如果我通过调试器并稍等片刻,我最终会看到我正在解析的信息:用户名、用户编号和用户图片)我查询的所有内容都表明我应该使用 AsyncTask 来完成此操作。与使用线程阻塞或信号量 b/c 不同,AsyncTask 是线程安全的。
据我了解,Firebase 查询已经在异步执行;因此,我“尝试”实现的 AsyncTask 的 doInBackground 方法似乎是多余的。另外,我对 AsyncTask 的重载签名和对以下内容的调用有点困惑:new someTask.execute("some stuff in a string")。
关于如何完成此任务的任何建议?非常感谢任何反馈!
//粘贴我的代码时请忽略小缩进
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;
}
【问题讨论】:
-
所以我想通了。我摆脱了 AsyncTask 并将我想在 onProgressUpdate 中执行的方法调用移到我的 onDataChange 的 for 循环之外,以便实际访问 onDataChange 方法的线程调用我的 populateFriendsView 方法。
-
很高兴听到您发现并感谢您的反馈。您能否提供该信息作为答案(您可能需要稍等片刻才能被允许这样做)?然后,您也可以接受自己的答案,这有助于建立您的声誉得分。
-
感谢@FrankvanPuffelen 的反馈。
-
Firebase 还有一个操作系统库,可以自动填充 ListView:github.com/firebase/firebaseui-android
标签: java android android-asynctask firebase firebase-realtime-database