java - 在Android中从StackMob查询(匿名内部类)中提取对象的正确方法

标签 java android stackmob

StackMob 文档让我们知道如何正确执行查询:https://developer.stackmob.com/tutorials/android/Query-an-Object

我的问题是 Java 中从查询的内部类中实际提取此信息的正确方法是什么?

MyObject valueToReturn;

MyObject.query(MyObject.class, 
    new StackMobQuery().field(
    new StackMobQueryField(field).isEqualTo(val)), 
    new StackMobQueryCallback<MyObject>() {
        @Override
        public void failure(StackMobException arg0) {
            //nothing to see here.
        }
        @Override
        public void success(List<MyObject> arg0) {
            //
            //How do I set valueToReturn = arg0.get(0)?
            //or in any way access this list outside the
            //inner class.
            return;
        }
});

这里似乎有一个解决方案,但肯定有更好的方法。 https://stackoverflow.com/a/5977866/1528493

最佳答案

我来自 StackMob,尽管这更多的是一个常见的 Android 问题。

听起来您正在尝试进行同步 IO。 MyObject.query 是异步的,这意味着它将立即返回并继续执行。当成功回调被调用时,您所在的方法可能已经完成,并且 valueToReturn 可能已经超出范围,这就是为什么您不允许设置它。

由于某种原因,查询方法是异步的。你不想在 android 的主线程上执行 IO,因为这会阻塞其他一切。在 Android 上,您需要更多地考虑回调。而不是尝试这样做:

void myMethod() { MyObject valueToReturn;

    MyObject.query(MyObject.class, ..., new StackMobQueryCallback<MyObject>() {
        @Override
        public void failure(StackMobException arg0) {
          //nothing to see here.
        }
        @Override
        public void success(List<MyObject> arg0) {
            valueToReturn = arg0.get(0);
        }
    });
    blockUnilItReturns()
    doSomethingWith(valueToReturn);
}

你想做这样的事情:

void myMethod() {
    MyObject.query(MyObject.class, ..., new StackMobQueryCallback<MyObject>() {
        @Override
        public void failure(StackMobException arg0) {
          //nothing to see here.
        }
        @Override
        public void success(List<MyObject> arg0) {
            doSomethingWith(arg0.get(0));
        }
    });
}

然后您可能想要执行 runOnUiThread 来显示 Toast 或其他 UI 操作。这是一种不同的编程思维方式,但它是您在移动应用程序中处理 IO 异步性质的方式。

如果您有充分的理由希望您的方法是同步的,您可以使用链接到的数组技巧和诸如 CountDownLatch 之类的 block 来实现此目的 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html 只要确保这确实是您想要的,我怀疑它不是。

关于java - 在Android中从StackMob查询(匿名内部类)中提取对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15425522/

相关文章:

java - 什么是NumberFormatException,我该如何解决?

Java变量必须在它自己的范围内初始化?

java - AbstractMap.SimpleImmutableEntry 无法解析为类型

android - "onCreateView overrides nothing"

objective-c - Stackmob 链接器错误

java - 'java.util.NavigableMap'类型的属性不能被 'Map'注入(inject)

java - 动态插入数组的大小并将旧值保留在数组中

android - Google应用内结算: Using In-App-Billing Version 3,仍然谷歌提到交易发生在应用内结算版本2中

objective-c - 无法使用访问 token 创建 Facebook 用户