成员变量不能被匿名改变class
Member variable cannot be changed by annomyous class
我正在使用 Java 在 Android Studio 中编写应用程序,但我遇到了问题。我有一个这样的class
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
}
}
问题是在匿名 class(位置 1)中,elements 变量正在更改其内容,之后(位置 2)变量保持为空。为什么会这样?谢谢你,祝你有美好的一天。
您的元素变量在位置 2 中为空,因为您 运行 在 database.addToRequestQueue 调用中的代码是 运行 异步调用的。
这意味着该函数不是在调用的同一时刻执行的,而是有延迟。
所以发生的事情是您的用户点击,onClick 事件处理程序被调用,对数据库的请求被添加到队列中,紧接着您打印您的空元素集合,然后您的请求仅在未知的时间量,您的列表已填充。
您要做的是将所有使用该集合的代码移动到响应侦听器(位置 1)内。
我正在使用 Java 在 Android Studio 中编写应用程序,但我遇到了问题。我有一个这样的class
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
}
}
问题是在匿名 class(位置 1)中,elements 变量正在更改其内容,之后(位置 2)变量保持为空。为什么会这样?谢谢你,祝你有美好的一天。
您的元素变量在位置 2 中为空,因为您 运行 在 database.addToRequestQueue 调用中的代码是 运行 异步调用的。
这意味着该函数不是在调用的同一时刻执行的,而是有延迟。
所以发生的事情是您的用户点击,onClick 事件处理程序被调用,对数据库的请求被添加到队列中,紧接着您打印您的空元素集合,然后您的请求仅在未知的时间量,您的列表已填充。
您要做的是将所有使用该集合的代码移动到响应侦听器(位置 1)内。