Android http请求与Volley同步

时间:2017-04-21 09:46:13

标签: android

我编写代码来向服务器发送请求:

public void reqCategory() {
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://myaddress/getdata.php";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            //Json Parse
            try {

                JSONArray jsonArray = new JSONArray(response);

                catList.clear();

                for (int i=0; i<jsonArray.length(); i++) {

                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    catList.add(jsonObject.getString("categoria"));

                }

            } catch (JSONException e) {
                e.printStackTrace();

            }
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("Error -> ", error.toString());


        }
    }) {
        @Override
        protected Map<String, String> getParams() { //nessun parametro
            Map<String, String> params = new HashMap<String, String>();
            //no param at moment
            return params;
        }
    };
    queue.add(postRequest);
}

我宣布:

List<String> catList = new ArrayList<String>();

在我的onCreate中我有:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comanda);

    reqCategory();

    for (String s : catList) {
        Log.d("Categoria -> ", s);
    }
}

这应该用来自reqCategory()的值填充List catList,但for循环不显示值,因为请求是asyncron。

如何进行同步请求,以便在reqCategory()调用之后我在catList中有值,我可以看到循环中的值。

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试在代码中进行一些小修改

for (int i=0; i<jsonArray.length(); i++) {

                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String Temp = new 
                catList.add(new String(jsonObject.getString("categoria")));

            }

答案 1 :(得分:0)

您无法在Android上使用网络阻止UI线程。所有网络必须在单独的线程上,因此您需要重构您的代码,例如:

onCreate() {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_comanda);

  reqCategory();
}

其中reqCategory()必须产生,即网络的AsyncTask。完成AsyncTask后,您可以在onPostExecute()(或odInBackground()中执行循环,如果您不需要触摸UI小部件)。