尽管添加了元素,但ArrayList大小为零

时间:2018-03-15 11:33:42

标签: android

我正在开发一个Android应用程序。 我想将json数据检索到名为Expert的数据模型的ArrayList中。

这是onCreate()方法的代码

mExpertsList = new ArrayList<Expert>();
loadData();
Log.v("RESPONSE", Integer.toString(mExpertsList.size()));

以下是检索json数据的函数中的代码。

private void loadData(){

    RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors",
            null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray jarray = response.getJSONArray("actors");
                for (int i = 0; i < jarray.length(); i++) {
                    JSONObject object = jarray.getJSONObject(i);

                    Expert expert = new Expert();

                    expert.setImageUrl(object.getString("image"));
                    expert.setName(object.getString("name"));
                    expert.setTopic(object.getString("country"));
                    expert.setRating(random.nextFloat() * ((maxRating - minRating) + minRating));
                    expert.setDescription(object.getString("description"));

                    mExpertsList.add(expert);
                }
            }
            catch(JSONException e){
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    queue.add(jsonObjectRequest);
}

在loadData()方法中,mExpertsList在for循环结束时显示大小为6。使用日志消息检查了这一点。

但是在loadData()之后的一个Log语句显示mExpertsList的大小为零。

我在这里缺少什么?

5 个答案:

答案 0 :(得分:1)

Log.v("RESPONSE", Integer.toString(mExpertsList.size()));

所以每当你打电话的时候     在loadData()方法后mExpertsList {{1}}的{​​{1}}仍然是0。

只有在您获得API响应后,尺寸才会发生变化。

答案 1 :(得分:1)

JsonObjectRequest是一个异步请求,因此您的列表将在其他线程上更新。并且您同步记录了大小,因此它将始终打印0。

访问onResponse(JSONObject response);

中的列表
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors",
        null, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        try {
            JSONArray jarray = response.getJSONArray("actors");
            for (int i = 0; i < jarray.length(); i++) {
                JSONObject object = jarray.getJSONObject(i);

                Expert expert = new Expert();

                expert.setImageUrl(object.getString("image"));
                expert.setName(object.getString("name"));
                expert.setTopic(object.getString("country"));
                expert.setRating(random.nextFloat() * ((maxRating - minRating) + minRating));
                expert.setDescription(object.getString("description"));

                mExpertsList.add(expert);
            }
     Log.v("RESPONSE", mExpertsList.size());
        }
        catch(JSONException e){
            e.printStackTrace();
        }
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {

    }
});

答案 2 :(得分:1)

这是一个异步操作,Volley不会等待您的响应并执行您的下一个代码。

如果要打印Arraylist大小,请在for循环后打印,

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors",
    null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
    try {
        JSONArray jarray = response.getJSONArray("actors");
        for (int i = 0; i < jarray.length(); i++) {
            JSONObject object = jarray.getJSONObject(i);

            Expert expert = new Expert();

            expert.setImageUrl(object.getString("image"));
            expert.setName(object.getString("name"));
            expert.setTopic(object.getString("country"));
            expert.setRating(random.nextFloat() * ((maxRating - minRating) + minRating));
            expert.setDescription(object.getString("description"));

            mExpertsList.add(expert);
        }
 Log.v("RESPONSE", mExpertsList.size());
        }
        catch(JSONException e){
            e.printStackTrace();
        }
    }
    }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {

    }
});

它将打印列表的exxact大小。

答案 3 :(得分:0)

当您拨打loadData()时,您似乎正在进行某种异步呼叫:

mExpertsList = new ArrayList<Expert>();
loadData();
Log.v("RESPONSE", Integer.toString(mExpertsList.size()));

检查大小时,可能尚未调用onResponse()(Web调用的处理程序)。如果是这样,那么大小仍然会显示为零。

如果使用实际内容成功调用mExpertsList,您应该只依赖onResponse的内容。

答案 4 :(得分:0)

在第1部分中进行此更改:

mExpertsList = new ArrayList<Expert>();
loadData();
//Log.v("RESPONSE", Integer.toString(mExpertsList.size()));----Comment it out

第2部分的变更:

private void loadData(){

    RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors",
            null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray jarray = response.getJSONArray("actors");
                for (int i = 0; i < jarray.length(); i++) {
                    JSONObject object = jarray.getJSONObject(i);

                    Expert expert = new Expert();

                    expert.setImageUrl(object.getString("image"));
                    expert.setName(object.getString("name"));
                    expert.setTopic(object.getString("country"));
                    expert.setRating(random.nextFloat() * ((maxRating - minRating) + minRating));
                    expert.setDescription(object.getString("description"));

                    mExpertsList.add(expert);


                    Log.v("RESPONSE", Integer.toString(mExpertsList.size())); //-----New ADDED


                }
            }
            catch(JSONException e){
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    queue.add(jsonObjectRequest);
}