在我的Parse驱动的应用程序中的某个时刻,我正在构建一个ParseQuery
来从表中检索一定数量的数据(Parse称之为“类”)。
此课程包括Pointer
到其他课程。因此,默认情况下不提供数据(isDataAvailable() == false
)。我需要fetch()
所有Pointer
的数据。
这是我的功能代码:
// Simplified code
new ParseQuery<MyClass>("MyClass").where(...).findInBackground(new FindCallback<MyClass>() {
@Override
public void done(final List<MyClass> objects, final ParseException pe) {
for (final Object object : objects) {
object.fetchIfNeeded();
}
myCustomCallback.objects(objects);
}
});
这就是我的问题:Parse中的回调似乎在UIThread上运行(我测试Looper.getMainLooper().getThread() == Thread.currentThread()
)。
所以我最终得到了:
I / Choreographer:跳过X帧!应用程序可能在其主线程上做了太多工作。
我知道我可以使用fetchIfNeededInBackground()
来避免这种情况,但是当完成所有提取后,我的回调就不会运行。
如何在后台运行所有fetch
操作,但只有在完成后才会触发我的回调?
答案 0 :(得分:1)
我有同样的问题。在触发回调之前我需要做很多事情。
处理所有这些请求并确定最后一个请求是非常困难的。 所以我的解决方案是自己创建异步任务,并使用同步解析方法(删除,获取,保存......那些没有&#34; inBackground&#34; part =))
new AsyncTask<Void, Void, Object>() {
@Override
protected Object doInBackground(Void... params) {
List<MyClass> objects = new ParseQuery<MyClass>("MyClass").find();
for (final Object object : objects) {
object.fetchIfNeeded();
}
return objects;
}
@Override
protected void onPostExecute(Object objects) {
myCustomCallback.objects(objects);
}
}.execute();
这是许多&#34;嵌套&#34;的通用解决方案。调用。只需逐个添加它们。 但对你来说,我认为&#34;包括&#34; ParseQuery上的方法就足够了。
像
这样的东西new ParseQuery<MyClass>("MyClass").where("")
.include(NAME_OF_THE_OBJECT_IN_PARSE_DB)
.findInBackground(new FindCallback<MyClass>() {
@Override
public void done(final List<MyClass> objects, final ParseException pe) {
myCustomCallback.objects(objects);
}
});
您可以登入Parse documentation
我希望这会有所帮助。