我编写代码来向服务器发送请求:
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中有值,我可以看到循环中的值。
谢谢。
答案 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小部件)。