我有我存储不同属性的类城市和发送http request
的方法:
public class city {
int temperature;
String conditions;
String town;
String country;
String state;
public String requestData(String url) {
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObj = new JSONObject(response);
JSONObject mresponse = jsonObj.getJSONObject("query");
cityIndex = mresponse.optJSONObject("results").optJSONObject("channel").optJSONObject("location").getString("city");
SharedPreferences cityList = getSharedPreferences("cityList", MODE_PRIVATE);
SharedPreferences.Editor editor = cityList.edit();
editor.putString(cityIndex, response);
editor.apply();
}catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(stringRequest);
return null;
}
}
然后我在输入文本字段后输入这行代码,输入邮政编码,将其包装在网址中,然后将网址作为http请求发送到city.requestData()
内。然后将json进行字符串化并使用sharedpreferences发回。然后将json作为对象,然后存储在新创建的城市对象的不同属性中。然后将这些创建的城市存储在citylist数组中。
Editable zipCode = mCity.getText();
String API = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D" + String.valueOf(zipCode) + ")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
city createdCity = new city();
createdCity.requestData(API);
dialog.dismiss();
SharedPreferences cityList = getSharedPreferences("cityList", MODE_PRIVATE);
String mResponse= cityList.getString(cityIndex, "");
try {
JSONObject jsonObj = new JSONObject(mResponse);
JSONObject response = jsonObj.getJSONObject("query");
createdCity.temperature = response.optJSONObject("results").optJSONObject("channel").optJSONObject("item").optJSONObject("condition").getInt("temp");
createdCity.conditions = response.optJSONObject("results").optJSONObject("channel").optJSONObject("item").optJSONObject("condition").getString("text");
createdCity.town = response.optJSONObject("results").optJSONObject("channel").optJSONObject("location").getString("city");
createdCity.country = response.optJSONObject("results").optJSONObject("channel").optJSONObject("location").getString("country");
createdCity.state = response.optJSONObject("results").optJSONObject("channel").optJSONObject("location").getString("region");
cities.add(createdCity);
addMenuItemInNavMenuDrawer(createdCity.town , createdCity.state);
} catch (JSONException e) {
e.printStackTrace();
}
Log.d("cities", cities.toString());
i++;
我的问题是我的代码是在记录“城市”时,第一个城市从未记录,第二个城市记录为第一个城市应该是的。
例如,如果我输入堪萨斯州,它将被记录为[]。然后我输入了纽约,它将被记录在堪萨斯州。然后我输入洛杉矶,它会退出纽约。
有谁知道这是为什么?
答案 0 :(得分:0)
在城市完成请求之前,您似乎正在检索共享首选项。请记住网络请求是在后台线程中进行的。当城市仍在请求数据时,您会读取上一个城市存储的偏好。