在下面的函数中,我正在使用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行,它切换回主线程以通知结果。

07-26 06:13