0

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

4

1 に答える 1

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を実行して、トーストまたはその他のUIアクションを表示することができます。これはプログラミングについての別の考え方ですが、モバイルアプリケーションでIOの非同期性を処理する方法です。

メソッドを同期させたい本当に正当な理由がある場合は、リンク先の配列トリックと、CountDownLatchhttp://docs.oracle.com/javase/1.5.0/docs/のようなブロックを使用して同期をとることができます 。 api / java / util / concurrent / CountDownLatch.html 本当にあなたが望むものであることを確認してください、そうではないと思います。

于 2013-03-15T18:23:50.387 に答える