【问题标题】:Member variable cannot be changed by annomyous class [duplicate]匿名类不能更改成员变量[重复]
【发布时间】:2018-02-13 09:16:53
【问题描述】:

我正在使用 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),elements 变量正在改变他的内容,之后(位置 2)变量保持为空。为什么会这样?谢谢你,祝你有美好的一天。

【问题讨论】:

  • 查看您的日志。哪条线路先运行?
  • 你有没有尝试将变量声明为final
  • 是的,您只是在定义回调侦听器,它很可能会在 (2) 处的 println 已经运行后稍后运行
  • 看一眼你的代码,看起来第 2 行可以在第 1 行之前运行
  • 是的。看起来第 2 行在第 1 行之前运行。

标签: java android android-volley anonymous-class


【解决方案1】:

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

这意味着函数不是在调用的同时执行,而是有延迟。

所以发生的情况是您的用户单击,onClick 事件处理程序被调用,对数据库的请求被添加到队列中,然后您打印您的空元素集合,然后您的请求仅在未知数量之后才被填充时间和您的列表已填充。

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

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 2019-01-27
    • 1970-01-01
    • 2021-03-06
    • 2016-11-05
    • 2013-11-22
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多