【问题标题】:How to get object out of inner class如何将对象从内部类中取出
【发布时间】:2016-03-06 10:30:34
【问题描述】:

我正在尝试在 Android 中制作此应用程序,我从foursquare 的API 中获取JSON 格式的数据,我需要对其进行解析以将其呈现在另一个意图中。 我正在使用 Android 的 volley 库来获取 JSON,但问题是 JsonObjectRequest 的 onResponse() 函数没有返回参数。所以我无法获取从 onResponse 之外的 url 获取的 JSON 对象。 我以前没有使用过 volley,因此对此不太了解,感谢任何帮助。这是我试图使其工作的代码。

编辑:我面临的主要问题是,在这种情况下,我无法为 JsonObjectRequest 的 onResponse 方法中的 myPlaces 赋值给全局变量。或者准确地说,内部赋值的变量在外部没有任何意义,因此在最后一行

            Toast.makeText(MainActivity.this, myPlaces[2].getName(), Toast.LENGTH_LONG).show();

当我尝试访问 myPlaces[2] 时,它给了我一个空指针异常。

谢谢。

 public void onClick(View v) {

            RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(urlString, null, new com.android.volley.Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        JSONObject meta = response.getJSONObject("meta");
                        String status = meta.getString("code");
                        Toast.makeText(MainActivity.this, status, Toast.LENGTH_SHORT).show();


                        if(status.equals("200"))
                        {
                            JSONObject responseJson = response.getJSONObject("response");
                            JSONArray venues = responseJson.getJSONArray("venues");
                            Places[] tempPlaces = new Places[venues.length()];
                            for (int i = 0 ; i < venues.length(); i++)
                            {
                                Places place = new Places();
                                JSONObject venueObject = venues.getJSONObject(i);
                                place.setName(venueObject.getString("name"));
                                JSONObject locatVenue = venueObject.getJSONObject("location");
                                place.setLat(locatVenue.getDouble("lat"));
                                place.setLon(locatVenue.getDouble("lng"));
                                tempPlaces[i] = place;
                            }

                            Toast.makeText(MainActivity.this, tempPlaces[2].getName(), Toast.LENGTH_LONG).show();
                            myPlaces = tempPlaces;
                        }

                        else
                        {
                            Toast.makeText(MainActivity.this, "No response from API", Toast.LENGTH_LONG).show();
                        }


                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(MainActivity.this, "There is some error here", Toast.LENGTH_LONG).show();
                    }

                }
            }, new com.android.volley.Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MainActivity.this, "There has been some error", Toast.LENGTH_LONG).show();
                }
            });

            requestQueue.add(jsonObjectRequest);
            Toast.makeText(MainActivity.this, myPlaces[2].getName(), Toast.LENGTH_LONG).show();

【问题讨论】:

标签: java android json android-volley inner-classes


【解决方案1】:

Volley 本身不是内部类;响应是一个匿名类。

您不需要在 Volley 中返回,您只需使用已在您的类中定义的变量。

我假设myPlaces 是您班级中的一个字段?否则,我不确定它在 onClick 之外的声明位置..

这一行分配了myPlaces,看起来它可以正常工作

myPlaces = tempPlaces;

您可以在您的类中定义一个方法来解析整个 JSONObject,而不是需要从 Volley 返回。这只是将逻辑传递给另一个方法,因此您无需考虑在 Volley 内部“返回”。

public void parseJSON(JsonObject object) 

然后将 volley 中的 response 传递到该方法中,并进行正常的解析和变量赋值,然后您可以在该方法中 Toast myPlaces。

另外,请注意 Volley 是异步的,这意味着您不能保证立即获得结果,所以

Toast.makeText(MainActivity.this, myPlaces[2].getName(), Toast.LENGTH_LONG).show();

可能会抛出 NullPointerException 或 IndexOutOfBoundsException,因为 myPlaces 在 Volley 请求之前未声明或为空。我这么说是因为它似乎没有在 Volley 请求之前分配。

【讨论】:

  • 哦,这真的很有帮助。现在我因为没有考虑创建方法而只是传递对象而感到愚蠢。谢谢。希望这对其他人有所帮助。
  • 你的主要问题是 volley 是异步的,所以你得到了 NullPointerException
猜你喜欢
  • 2010-12-21
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多