我下面的函数应该从parse.com返回所有学生,在一段代码(下面评论)中,列表完全填充了正确的结果,但是在函数末尾列表为空。我不太明白这里发生了什么,非常感谢任何帮助。
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;
}
答案 0 :(得分:2)
根据https://parse.com/docs/android/api/com/parse/ParseQuery.html#findInBackground(com.parse.FindCallback):public void findInBackground(FindCallback callback)
从后台线程中的服务器检索满足此查询的ParseObjects列表。这比使用 find()更好,除非您的代码已经在后台线程中运行
因此,如果您想在您的方法中使用结果,请在FindCallback完成其工作时使用find或添加一些通知。
答案 1 :(得分:2)
findInBackground和任何其他后台调用是在不同的后台线程上执行的,你的完成处理程序(完成)只是一个存储在内存中的函数,直到后台线程完成处理和调用完成。因此,当您调用getAllStudents时,它将
无论你需要做什么,必须在else {}块中执行studentList,它将是异步的。
答案 2 :(得分:1)
同意上述内容,用简单的英语,您的代码将按如下方式执行:
请记住“.findinbackground”将始终转到后台线程。