在下面的函数中,我正在使用findInBackground
从Parse获取数据。由于此函数在后台运行,因此如何在数据准备就绪时通知主UI线程,以便隐藏进度条微调器并实际显示此数据?
使用findInBackground
而不是find()
的原因是因为我不希望在从Parse Server进行抓取时冻结主UI。
public List<Student> getAllStudents() {
final List<Student> studentList = new ArrayList<Student>();
ParseQuery<ParseObject> query = ParseQuery.getQuery("Student");
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> list, ParseException e) {
if (e == null) {
for (ParseObject o : list) {
Student s = new Student();
s.setObjectId(o.getObjectId());
s.setFirstName(o.getString("FirstName"));
s.setSurname(o.getString("Surname"));
s.setDOB(o.getString("DOB"));
s.setInstructor(o.getBoolean("Instructor"));
studentList.add(s);
}
// studentList is full here
} else {
}
// studentList is full here too
}
});
// studentList is empty here
return studentList;
}
最佳答案
我想你误会了。网络呼叫findInBackground
在后台完成,是的。但是done
在主线程上被调用。因此,您可以在此完成对ui所做的任何更改而不会出现问题。我一直在我的done
回调中关闭微调框。
查看Parse.com源代码; findInBackground()
调用此行:
ParseTaskUtils.callbackOnMainThreadAsync(task, callback);
这告诉我回调在主线程上。可以肯定的是,我查看了
ParseTaskUtils
。果然,在〜107行,它切换回主线程以通知结果。