从解析对象查询回调中返回对象数据

时间:2015-01-11 20:06:22

标签: java android callback parse-platform

我对Java / android编程很陌生,而且我被困在Parse.com回调中。

有一个方法(method1),它请求当前用户拥有的对象的objectId。它通过调用另一个方法(method2)来实现这一点,该方法包含一个查询,该查询通过回调从数据浏览器中提取对象。

我设法编写了所有代码,但我仍然坚持使用方法2的回调。我希望将对象数据返回给方法1,但由于Callback类型(void),这似乎是不可能的。

我现在也知道如何让方法的其余部分等待回调在执行之前返回..如果有人能帮助我,我将不胜感激。

这是我的代码:

public void method1(){
    String objectId = null;

    objectId = QueryStatisticObjectId("Age");

    Log.i(TAG, "objectId returned to method = " + objectId);
}



    public String QueryStatisticObjectId(final String statistic){
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Statistics");
        query.whereEqualTo("user", ParseUser.getCurrentUser());
        query.whereEqualTo("statistic", statistic);
        query.getFirstInBackground(new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject object, ParseException e) {
                if (e == null){
                    //We have data!
                    String objectId = object.getObjectId();
                    return;
                }
                else
                {
                    //Something went wrong!?!
                    e.printStackTrace();
                }
            }
        });

2 个答案:

答案 0 :(得分:2)

因此,在iOS或Android中使用Parse无法实现您尝试做的事情。我认为它可能会以你想要的方式运行.NET(使用 Await 关键字)。

相反,问问自己:

  1. 你为什么要以这种方式建立你的班级?
  2. 为什么将值返回到原始方法很重要?
  3. 是否只是因为你想要一种可循环使用的方法?
  4. 是不是因为你想在方法上下文中处理更有意义的值?
  5. 如果是这样,请尝试以下方法:

    public void method1() {
        QueryStatisticObjectId("Age", new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject object, ParseException e) {
                if (e == null) {
                    String objectId = object.getObjectId();
                    Log.i(TAG, "objectId returned to method = " + objectId);
                } else {
                    Log.i(TAG, "objectId not found");
                }               
            }
        });
    }
    
    public void QueryStatisticObjectId(final String statistic, GetCallback<ParseObject> callback) {
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Statistics");
        query.whereEqualTo("user", ParseUser.getCurrentUser());
        query.whereEqualTo("statistic", statistic);
        query.getFirstInBackground(callback);
    }
    

    通过这种方式,您可以编写代码来处理有意义的上下文(method1())中的返回结果,同时还可以根据需要重新使用查询方法。此外,与@ JimW的答案相反,这并不利用同步网络电话,这也使您有机会保持应用程序的用户界面响应。

答案 1 :(得分:0)

我遇到了同样的问题,回调真的很烦人,似乎它们随机发射,并且返回类型的void使得覆盖所有必要的东西。我通过使用常规.find()而没有回调来解决您的问题。然后我使用自定义代码完成了所有繁琐的工作。