Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中从StackMob查询(匿名内部类)中提取对象的正确方法_Java_Android_Stackmob - Fatal编程技术网

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

Java Android中从StackMob查询(匿名内部类)中提取对象的正确方法,java,android,stackmob,Java,Android,Stackmob,StackMob文档让我们知道如何正确执行查询: 我的问题是,在Java中,从查询的内部类中提取这些信息的正确方法是什么 MyObject valueToReturn; MyObject.query(MyObject.class, new StackMobQuery().field( new StackMobQueryField(field).isEqualTo(val)), new StackMobQueryCallback<MyObject>() {

StackMob文档让我们知道如何正确执行查询:

我的问题是,在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;
        }
});
MyObject值返回;
MyObject.query(MyObject.class,
新建StackMobQuery().字段(
新StackMobQueryField(field).isEqualTo(val)),
新的StackMobQueryCallback(){
@凌驾
公共无效失败(StackMobException arg0){
//这里没什么可看的。
}
@凌驾
公共作废成功(列表arg0){
//
//如何设置valueToReturn=arg0.get(0)?
//或者以任何方式访问此列表
//内部阶级。
返回;
}
});
这里似乎有一个解决办法,但肯定有更好的办法。

我来自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 value返回;
query(MyObject.class,…,新的StackMobQueryCallback(){
@凌驾
公共无效失败(StackMobException arg0){
//这里没什么可看的。
}
@凌驾
公共作废成功(列表arg0){
valueToReturn=arg0.get(0);
}
});
blockUnilItReturns()
doSomethingWith(值返回);
}
您希望执行以下操作:

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));
        }
    });
}
void myMethod(){
query(MyObject.class,…,新的StackMobQueryCallback(){
@凌驾
公共无效失败(StackMobException arg0){
//这里没什么可看的。
}
@凌驾
公共作废成功(列表arg0){
doSomethingWith(arg0.get(0));
}
});
}
然后,您可能需要执行runOnUiThread以显示Toast或其他UI操作。这是一种不同的编程思维方式,但这是如何处理移动应用程序中IO的异步特性

如果你有一个很好的理由希望你的方法是同步的,你可以通过你链接到的数组技巧和一些像CountDownLatch这样的块来实现
只要确保它真的是你想要的,我怀疑它不是。我来自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 value返回;
query(MyObject.class,…,新的StackMobQueryCallback(){
@凌驾
公共无效失败(StackMobException arg0){
//这里没什么可看的。
}
@凌驾
公共作废成功(列表arg0){
valueToReturn=arg0.get(0);
}
});
blockUnilItReturns()
doSomethingWith(值返回);
}
您希望执行以下操作:

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));
        }
    });
}
void myMethod(){
query(MyObject.class,…,新的StackMobQueryCallback(){
@凌驾
公共无效失败(StackMobException arg0){
//这里没什么可看的。
}
@凌驾
公共作废成功(列表arg0){
doSomethingWith(arg0.get(0));
}
});
}
然后,您可能需要执行runOnUiThread以显示Toast或其他UI操作。这是一种不同的编程思维方式,但这是如何处理移动应用程序中IO的异步特性

如果你有一个很好的理由希望你的方法是同步的,你可以通过你链接到的数组技巧和一些像CountDownLatch这样的块来实现
只要确保它确实是您想要的,我怀疑它不是。

这是允许的valueToReturn=arg0.get(0),有什么问题吗?您不能设置valueToReturn=arg0.get(0);,错误是“无法在不同方法中定义的内部类中引用非最终变量ret”,然后将valueToReturn设置为字段这是允许的valueToReturn=arg0.get(0),有什么问题您无法设置valueToReturn=arg0.get(0);,错误是“无法在不同方法中定义的内部类中引用非最终变量ret”,然后将valueToReturn设置为字段