如何使用匿名内部类方法填充外部类的'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”执行任何操作都会显示它已经变回空。有人可以指点我正确的方向吗?提前谢谢!
答案 0 :(得分:1)
我认为您并不完全了解程序的执行流程
你正在使用什么库并不是很清楚,但似乎RestClient.get()
正在发出异步请求,这意味着它不会等待响应并且不会阻止主线程执行。通常,它正在构建一些请求对象并将其执行提交给另一个线程。这就是为什么你需要提供JsonHttpResponseHandler
的实现 - 它负责在响应准备好时处理响应。
因此,您的ArrayList在打印时没有“回到空白”, 为空。
顺便说一句,构造函数不是这种逻辑的好地方。我将它移动到一个单独的服务类,使其负责创建和填充Bookshelf
对象。