我正在使用Java在Android Studio中编写应用程序,但我遇到了问题。我有一个这样的课程
class MyListener implements AdapterView.OnItemClickListener {
ArrayList<Element> elements = new ArrayList<>();
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
databaseServer.addToRequestQueue(new StringRequest(
Request.Method.POST,
DatabaseServerDetails.ELEMENTS_PAGE,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
elements.addAll(Element.extractData(response));
System.out.println(elements);-------------->1
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("requestJoinDietsWithMeals", error.getLocalizedMessage());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("elementID", elementID + "");
return params;
}
});
System.out.println(elements); ------------>2
}
}
问题是在匿名类(位置1)内部,元素变量正在更改其内容,之后(位置2)变量保持为空。为什么会这样?谢谢你,祝你有个美好的一天。
答案 0 :(得分:3)
您的elements变量在位置2中为空,因为您在调用database.addToRequestQueue内部运行的代码是异步运行的。
这意味着函数不会在调用的同一时刻执行,但会有延迟。
所以会发生什么事情是您的用户点击,onClick事件处理程序被调用,对数据库的请求被添加到队列中,然后您打印空元素集合,然后您的请求仅在未知金额后填写时间和你的清单已填充。
您要做的是将所有使用该集合的代码移动到响应侦听器(位置1)中。