第一个对象没有添加到arraylist

时间:2018-06-08 17:03:10

标签: java android

我有我存储不同属性的类城市和发送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++;

我的问题是我的代码是在记录“城市”时,第一个城市从未记录,第二个城市记录为第一个城市应该是的。

例如,如果我输入堪萨斯州,它将被记录为[]。然后我输入了纽约,它将被记录在堪萨斯州。然后我输入洛杉矶,它会退出纽约。

有谁知道这是为什么?

1 个答案:

答案 0 :(得分:0)

在城市完成请求之前,您似乎正在检索共享首选项。请记住网络请求是在后台线程中进行的。当城市仍在请求数据时,您会读取上一个城市存储的偏好。