Parse.com查询findInBackground不会返回任何数据

时间:2014-08-20 18:05:58

标签: java android parse-platform

我下面的函数应该从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;
}

3 个答案:

答案 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时,它将

  1. 创建查询
  2. 在不同的线程中将查询告诉findInBackground
  3. 立即返回行返回studentList
  4. 返回呼叫功能
  5. 无论你需要做什么,必须在else {}块中执行studentList,它将是异步的。

答案 2 :(得分:1)

同意上述内容,用简单的英语,您的代码将按如下方式执行:

  1. final List studentList = new ArrayList();
  2. ParseQuery query = ParseQuery.getQuery(“Student”);
    ------&GT; 1. query.findInBackground(弹出到后台线程)
  3. 返回studentList(是的,当你到达这里时,studentList可能会为null)。
  4. 请记住“.findinbackground”将始终转到后台线程。