use*_*493 0 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;
}
});
Run Code Online (Sandbox Code Playgroud)
这里似乎有一个解决方案,但肯定有更好的方法. /sf/answers/418450651/
小智 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);
}
Run Code Online (Sandbox Code Playgroud)
你想做的事情如下:
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));
}
});
}
Run Code Online (Sandbox Code Playgroud)
然后,您可能希望执行runOnUiThread以显示Toast或其他UI操作.这是一种考虑编程的不同方式,但它是如何处理移动应用程序中IO的异步性质的.
如果你有一个非常好的理由希望你的方法是同步的,你可以使用你链接到的数组技巧和像CountDownLatch http://docs.oracle.com/javase/1.5.0/docs/这样的阻塞. api/java/util/concurrent/CountDownLatch.html请 确保它真的是你想要的,我怀疑它不是.
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |