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

时间:2013-03-15 05:39:12

标签: 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

1 个答案:

答案 0 :(得分:5)

我来自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这样的块来实现 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html 只要确定它真的是你想要的,我怀疑它不是。