【问题标题】:java work around to access a variable from anonymous inner class not workingjava解决方法以从匿名内部类访问变量不起作用
【发布时间】:2026-02-01 04:40:01
【问题描述】:

对不起,这是一个重复的问题,

虽然提到了这个post。我试图从匿名内部类中分配一个值。但它总是打印 null[Toast.makeText(getBaseContext(),token[0],Toast.LENGTH_SHORT).show();] 。我在此代码示例中做错了什么。

还有比这更好的返回字符串值的方法吗?

public String getAccessToken(String url) {
        final String[] token = new String[1];
        JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.POST, url,
                new Response.Listener<JSONObject>()
                {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            token[0] = response.getString("access_token");
                            tv.setText(token[0]);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // error
                        Log.d("Error.Response", String.valueOf(error));
                    }
                }
        );
        queue.add(postRequest);
        Toast.makeText(getBaseContext(),token[0],Toast.LENGTH_SHORT).show();
        return token[0];
    }

【问题讨论】:

  • 您打算如何在请求完成之前返回令牌?目前,您创建数组(默认包含 null),创建请求,将请求添加到队列,然后返回数组的内容(仍然为 null!)。几毫秒后,大概您可以查看队列并实际执行请求。
  • @immibis 我正在使用Volly 库发出发布请求。当它进入onResponse 方法时,它将具有该值。我可以将该值设置为TextView(电视)。但无法在 onResponse 方法之外分配和返回该值。
  • 嗯,是的,因为您试图在调用 onResponse 之前获取值。
  • 那么如何实现呢?
  • 我不明白一件事。我正在分配一个变量taken[0],它在onResponse 方法中也有一个范围,并使用该变量将其设置为Toast。这意味着token[0] 已经分配了一个值。但是当我尝试在该方法之外打印相同的变量时,它是空的。赋值后为什么值是空的?

标签: java android anonymous-inner-class


【解决方案1】:

在分配任何内容之前,您基本上是在返回 token[0]。该方法的工作方式是这样的:

您在此时创建token[0](即null)。 你发送请求。 您返回token[0](此时仍为null) 您从请求中获得响应,该响应具有您最初想要的 token[0] 的值。

除非您收到回复,否则token[0] 将是null。您将无法从该方法返回它。相反,我只需将其设为void 并等待请求完成。如果你愿意,你可以从onResponseToast 它。

public void getAccessToken(String url) {
    JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.POST, url,
            new Response.Listener<JSONObject>()
            {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        token[0] = response.getString("access_token");
                        tv.setText(token[0]);
                        // do some other stuff with token[0], like toast or whatever
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.d("Error.Response", String.valueOf(error));
                }
            }
    );
    queue.add(postRequest);
}

【讨论】: