【问题标题】:Modify outer class property within anonymous class修改匿名类中的外部类属性
【发布时间】:2016-11-10 12:20:42
【问题描述】:

如何使用匿名内部类方法填充外部类的“ArrayList”?这是我的代码:

public class Bookshelf {

    private static final String TAG = "Bookshelf";
    private final ArrayList<Book> books = new ArrayList<Book>();

    public Bookshelf() {
        try {
            setContent();
        } catch(JSONException e) {
            Log.i(TAG, e.getMessage());
        }
        Log.i(TAG, Integer.toString(books.size())); //outputs "0" (incorrect)
    }

    private void setContent() throws JSONException {
        RestClient.get("/books/", null, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                super.onSuccess(statusCode, headers, response);

                for(int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject obj = response.getJSONObject(i);

                        Book book = new Book();
                        book.setId(obj.getInt("_id"));
                        book.setTitle(obj.getString("name"));

                        books.add(book);
                    } catch (JSONException e) {
                        System.exit(1);
                    }
                }
                Log.i(TAG, Integer.toString(books.size())); //outputs 60 (correct)
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                super.onFailure(statusCode, headers, responseString, throwable);
                System.exit(1);
            }
        });
    }
}

API 调用运行良好,并且“ArrayList”在内部类中正确填充。但是,尝试对内部类之外的“ArrayList”执行任何操作表明它已变回为空。有人可以指出我正确的方向吗?提前致谢!

【问题讨论】:

  • JsonHttpResponseHandler 看起来像番石榴的未来。如果它是某种未来,你可能需要阻止它,因为在未来完成和你检查外部类的内容之间会有一场比赛。
  • 如果它是 android-async-http JsonHttpResponseHandler,您需要将其映射到某种未来的风格,或者在您在回调中设置的setContent 中有一个CountDownLatch,然后@ 987654324@ 在setContent 返回之前打开。
  • 试试:books.add(new Book());books.get(i).setId(obj.getInt("_id"));books.get(i).setTitle(obj.getString("name"));
  • @FallaCoulibaly 谢谢,但还是不行。
  • 您是否尝试将应该存储books 的部分以JSONObject 作为参数并在您的匿名类中调用它?

标签: java api rest oop arraylist


【解决方案1】:

我认为你并没有完全理解你的程序的执行流程。
目前还不是很清楚您使用的是什么库,但似乎RestClient.get() 正在发出一个异步 请求,这意味着它不会等待响应,也不会阻塞主线程执行。通常,它正在构建一些请求对象并将其执行提交给另一个线程。这就是为什么您需要提供 JsonHttpResponseHandler 的实现 - 它负责在响应准备好时处理它。
因此,您的 ArrayList 并没有“变回空”,它在打印时 为空。
顺便说一句,构造函数不是这种逻辑的好地方。我会将其移至某个单独的服务类,使其负责创建和填充Bookshelf 对象。

【讨论】:

  • 明白了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多