成员变量不能通过annomyous类更改

时间:2018-02-13 09:16:53

标签: java android android-volley anonymous-class

我正在使用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)变量保持为空。为什么会这样?谢谢你,祝你有个美好的一天。

1 个答案:

答案 0 :(得分:3)

您的elements变量在位置2中为空,因为您在调用database.addToRequestQueue内部运行的代码是异步运行的。

这意味着函数不会在调用的同一时刻执行,但会有延迟。

所以会发生什么事情是您的用户点击,onClick事件处理程序被调用,对数据库的请求被添加到队列中,然后您打印空元素集合,然后您的请求仅在未知金额后填写时间和你的清单已填充。

您要做的是将所有使用该集合的代码移动到响应侦听器(位置1)中。