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 回答