gpt4 book ai didi

java - 如何从内部类中获取对象

转载 作者:行者123 更新时间:2023-12-01 10:17:17 24 4
gpt4 key购买 nike

我正在尝试在 Android 中制作此应用程序,我正在从 foursquare 的 API 获取 JSON 格式的数据,并且我需要解析它以将其呈现在另一个 Intent 中。我正在使用 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();

最佳答案

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

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

我假设 myPlaces 是您类(class)中的一个字段?否则,我不确定它是在 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 请求之前分配。

关于java - 如何从内部类中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com