在自定义回调之前从ParseQuery中获取所有ParseObject

时间:2015-04-30 12:52:12

标签: android parse-platform

在我的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操作,但只有在完成后才会触发我的回调?

1 个答案:

答案 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

我希望这会有所帮助。