添加元素后,ArrayList为空

我有这个Android代码从服务器带来一个JSON并从该JSON填充一个ArrayList我检查了响应空间内的ArrayList“饭”的大小它给了我1但是当我在StringRequest对象后检查它我得到0项。 餐点在全局范围内定义并在oncreateview函数内初始化。代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment Log.i("debug","on create view"); View view =inflater.inflate(R.layout.fragment_meal_list,container,false); ListView List ; meals=new ArrayList(); String url="http://syriankitchen.tk/get_recent.php"; StringRequest mealsrequest = new StringRequest(Request.Method.GET, url, new Response.Listener() { @Override public void onResponse(String response) { try{ JSONObject object= new JSONObject(response); JSONArray mealsArray = object.getJSONArray("result"); for(int i=0;i<mealsArray.length();i++){ JSONObject cur = mealsArray.getJSONObject(i); int id= cur.getInt("id"); String name= cur.getString("name"); String description = cur.getString("description"); int price = cur.getInt("price"); meals.add(new meal(id,name,price,description)); } Log.i("debug","meals size = "+meals.size()); } catch(JSONException e){ e.printStackTrace(); } } },new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getActivity(),error.getMessage(),Toast.LENGTH_SHORT).show(); } }); Volley.newRequestQueue(getActivity()).add(mealsrequest); ArrayList strs=new ArrayList(); String mealsnames[]=new String[meals.size()]; for(int i=0;i<meals.size();i++)strs.add(meals.get(i).getName()); strs.toArray(mealsnames); Log.i("debug","meals ou size "+meals.size()); CustomList adapter = new CustomList(getActivity(),mealsnames,meals); List = (ListView)view.findViewById(R.id.list); List.setAdapter(adapter); 

这里的问题是了解asynchronous任务的工作原理。 当您向队列中添加一个volley请求时,它将在后台线程中运行(离开主线程)并且控件将传递到下一行。

所以,在此之后:

 Volley.newRequestQueue(getActivity()).add(mealsrequest); 

控制转到这个:

 ArrayList strs=new ArrayList(); String mealsnames[]=new String[meals.size()]; 

现在因为meals是在后台线程上更新的,所以你无法在控制时间到达的时候得到数据String mealsnames[]=new String[meals.size()];

所以你在这里得到尺寸( meals.size() )。

尝试将此部分代码移动到onResponse

试试这样:

 public void updateData(){ ArrayList strs=new ArrayList(); String mealsnames[]=new String[meals.size()]; for(int i=0;i 

并从onResponse调用此方法:

 @Override public void onResponse(String response) { try{ JSONObject object= new JSONObject(response); JSONArray mealsArray = object.getJSONArray("result"); for(int i=0;i
		      	

当你写这个 –

 Volley.newRequestQueue(getActivity()).add(mealsrequest); 

这意味着你正在进行异步调用,而mealsrequest将在另一个线程上运行。 你正在打印 –

 Log.i("debug","meals ou size "+meals.size()); 

就在你mealsrequest 。 当控制到达此语句时,您的网络请求尚未完成。 显然,你的清单中没有任何东西。 您的列表将仅填充在onResponse() ,因为该方法在网络请求完成后执行。