【问题标题】:ArrayList being empty after adding elements添加元素后ArrayList为空
【发布时间】:2016-08-15 02:59:09
【问题描述】:

我有这个 android 代码,它从服务器带来一个 JSON 并从该 JSON 填充一个 ArrayList 我检查了 onresponse void 内的 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<meal>();
String url="http://syriankitchen.tk/get_recent.php";
StringRequest mealsrequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {

    @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<String> strs=new ArrayList<String>();
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);

【问题讨论】:

  • 您对after 的含义感到困惑。回调是异步的。

标签: java android arraylist


【解决方案1】:

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

那么,在这之后:

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

控制权传递给这个:

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

现在由于meals是在后台线程更新的,所以当控制到达String mealsnames[]=new String[meals.size()];时你是无法获取数据的

因此,您将在此处获得 大小 (meals.size())。

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

试试这样:

public void updateData(){
   ArrayList<String> strs=new ArrayList<String>();
   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);
}

并从onResponse调用此方法:

@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());
        updateData();
    }
    catch(JSONException e){
        e.printStackTrace();
    }
}

【讨论】:

    【解决方案2】:

    当你写这篇文章时 -

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2021-03-19
      • 2014-05-06
      相关资源
      最近更新 更多