Android 如何从主UI线程检测解析';s query.findInBackground是否已完成并返回数据?

Android 如何从主UI线程检测解析';s query.findInBackground是否已完成并返回数据?,android,multithreading,asynchronous,parse-platform,Android,Multithreading,Asynchronous,Parse Platform,在下面的函数中,我使用findInBackground从Parse获取数据。由于此函数在后台运行,如何在数据准备就绪时通知主UI线程,以便隐藏进度加载微调器并实际显示此数据 使用findInBackground而不是find()的原因是,我不希望在从解析服务器获取数据时主UI冻结 public List<Student> getAllStudents() { final List<Student> studentList = new ArrayList<Studen

在下面的函数中,我使用
findInBackground
从Parse获取数据。由于此函数在后台运行,如何在数据准备就绪时通知主UI线程,以便隐藏进度加载微调器并实际显示此数据

使用
findInBackground
而不是
find()
的原因是,我不希望在从解析服务器获取数据时主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;
}
公共列表getAllStudents(){
最终列表studentList=newarraylist();
ParseQuery=ParseQuery.getQuery(“学生”);
findInBackground(新的FindCallback(){
公共作废完成(列表,异常解析){
如果(e==null){
for(解析对象o:list){
学生s=新学生();
s、 setObjectId(o.getObjectId());
s、 setFirstName(o.getString(“FirstName”);
s、 setSurname(o.getString(“姓氏”);
s、 setDOB(o.getString(“DOB”));
s、 Set讲师(o.getBoolean(“讲师”));
学生名单。添加;
}
//学生名单已经满了
}否则{
}
//这里的学生名单也满了
}
});
//学生列表在此为空
返回学生名单;
}

下面是一个使用java接口的观察者模式的好例子:


我想你误解了。网络调用
findInBackground
在后台完成,true。但是在主线程上调用
done
。因此,您对ui所做的任何更改都可以在那里顺利完成。我总是在
done
回调中忽略微调器

浏览Parse.com源代码;
findInBackground()
调用此行:

 ParseTaskUtils.callbackOnMainThreadAsync(task, callback);

这告诉我回调在主线程上。当然,我查看了
ParseTaskUtils
。果然,在第107行,它切换回主线程以通知结果

但是我如何从主线程知道
done
已经结束。控件甚至在执行
done
之前就返回到主线程,因为它发生在后台,因为它位于
findInBackground
done不在findInBackground的“内部”,所以您可以将新的FindCallback作为匿名类传递。这意味着,每当它在后台完成它正在做的任何事情时,它都将执行该代码。因此,这就是返回studentList数组不起作用的原因。我建议您在done方法中使用arrayList执行任何操作。干杯这个功能是一个独立的类,而不是我的主要活动。那么我如何在主活动中获得通知呢?我是否必须使用共享首选项或事件总线或类似的东西?此功能是否在活动中?如果是这样的话,你可以尝试startActivityForResult,下面是关于它的文档:否则你可以使用一个界面,当你得到一个学生列表时,它会通知你的活动。我想这个界面就是我想要的答案。不知道如何实现一个接口,我想有些东西需要学习