如何从内部 class 中取出对象
How to get object out of inner class
我正在尝试在 Android 中制作此应用程序,我正在从 foursquare 的 API 获取 JSON 格式的数据,我需要解析它以在另一个意图中呈现它。
我正在使用 Android 的 volley 库来获取 JSON 但问题是 JsonObjectRequest 的 onResponse() 函数没有 return parameter.so 我无法获取 JSON 从 onResponse 之外的 url 获得的对象。
我以前没有使用过排球,因此对此了解不多,感谢您的帮助。这是我试图让它工作的代码。
编辑:我面临的主要问题是,在本例中,我无法在 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();
排球本身并不是内在的class;响应是匿名的 class。
您不需要在 Volley 中使用 return,您只需使用已经在 class 中定义的变量。
我假设 myPlaces
是您的 class 中的一个字段?否则,我不确定它在 onClick 之外的何处声明。
这一行分配了 myPlaces
并且看起来可以正常工作
myPlaces = tempPlaces;
您可以在 class 中定义一个方法来解析整个 JSONObject,而不需要从 Volley return 中解析。这只是将逻辑传递给另一个方法,因此您无需考虑 Volley 内部的 "returning" 。
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 请求之前分配。
我正在尝试在 Android 中制作此应用程序,我正在从 foursquare 的 API 获取 JSON 格式的数据,我需要解析它以在另一个意图中呈现它。 我正在使用 Android 的 volley 库来获取 JSON 但问题是 JsonObjectRequest 的 onResponse() 函数没有 return parameter.so 我无法获取 JSON 从 onResponse 之外的 url 获得的对象。 我以前没有使用过排球,因此对此了解不多,感谢您的帮助。这是我试图让它工作的代码。
编辑:我面临的主要问题是,在本例中,我无法在 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();
排球本身并不是内在的class;响应是匿名的 class。
您不需要在 Volley 中使用 return,您只需使用已经在 class 中定义的变量。
我假设 myPlaces
是您的 class 中的一个字段?否则,我不确定它在 onClick 之外的何处声明。
这一行分配了 myPlaces
并且看起来可以正常工作
myPlaces = tempPlaces;
您可以在 class 中定义一个方法来解析整个 JSONObject,而不需要从 Volley return 中解析。这只是将逻辑传递给另一个方法,因此您无需考虑 Volley 内部的 "returning" 。
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 请求之前分配。