修改匿名类中的外部类属性

时间:2016-07-08 02:22:29

标签: java api rest oop arraylist

如何使用匿名内部类方法填充外部类的'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”执行任何操作都会显示它已经变回空。有人可以指点我正确的方向吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

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