3

AsyncHttpResponseHandler を使用して、RESTful サービスからデータを収集しています。私が直面している問題は、onSuccess コールバックで必要な変数にアクセスできないことです。

私のコードは次のとおりです。

for (int i=0; i<=count; i++) {
        requestItemsByCategory(context, categories.get(i), 10, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(String response) {
                loadItemsFromJsonString(context, response, categories.get(i));
            }
        });
    }

コンテキストとカテゴリは、明らかに onSuccess では利用できません。これらのグローバル変数を作成することもできますが、問題はこれがループ内で呼び出されることです。そのため、onSuccess が数回呼び出され、どちらが最初に返されるかは保証されません。

私はJavaにかなり慣れていません。Objetive-C では、コード ブロック内の無名関数の外部にある変数にアクセスできます。それができない場合は、クエリをカスタマイズしてすべてのデータを一度に取得し、クライアント側で解析する必要があります。これはとにかくより良い解決策ですが、アクセスするかどうかを知りたいですコールバック内のアイテムは可能です。

4

2 に答える 2

2

実際、このスコープでこれらの変数にアクセスすることはできませんが、このコードのクラスのインスタンスを介してそれらにアクセスしようとすることができます:

class YourCoolActivity extends Activity {

  // + getter/setter
  private int index;

  // The rest of the class

 private void yourCoolMethod(){
    for (int i=0; i<=count; i++) {
      this.setIndex(categories.get(i));
      requestItemsByCategory(this.getContext(), categories.get(i), 10, new AsyncHttpResponseHandler() {
          @Override
          public void onSuccess(String response) {
              loadItemsFromJsonString(YourCoolActivity.this.getContext(), response, YourCoolActivity.this.getIndex());
          }
      });
    }
  }
}
于 2013-03-14T17:40:40.070 に答える
0

匿名の内部クラスを使用する代わりに、onSuccess メソッドでアクセスする値をコンストラクターへのパラメーターとして受け取る単純な新しいクラスを作成できます。

class MyResponseHandler extends AsyncHttpResponseHandler() {
    private Context context;
    private Category category;
    public MyResponseHandler( Context context, Category category ) {
        this.context = context;
        this.category = category;
    }
    @Override
    public void onSuccess( String response ) {
        loadItemsFromJsonString(context, response, category);
    }
}

次に、コードは次のようになります

for (int i=0; i<=count; i++) {
    requestItemsByCategory(context, categories.get(i), 10, new MyResponseHandler(context, categories.get(i));
}
于 2013-03-14T18:16:25.140 に答える