首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管添加了元素,ArrayList大小为零

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

Stack Overflow用户
提问于 2018-03-15 11:33:42
回答 5查看 536关注 0票数 0

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

下面是onCreate()方法的代码

代码语言:javascript
复制
mExpertsList = new ArrayList<Expert>();
loadData();
Log.v("RESPONSE", Integer.toString(mExpertsList.size()));

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

代码语言:javascript
复制
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()之后的日志语句显示,mExpertsList的大小为零。

我在这里错过了什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-03-15 11:38:22

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

访问onResponse(JSONObject response)内部的列表;

代码语言:javascript
复制
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) {

    }
});
票数 1
EN

Stack Overflow用户

发布于 2018-03-15 11:37:46

代码语言:javascript
复制
mExpertsList = new ArrayList<Expert>();  // You are initializing your list with size 0
loadData();  // Calling the API which will run in background

因此,每当您在Log.v("RESPONSE", Integer.toString(mExpertsList.size()));方法之后调用loadData()方法时,您的mExpertsList仍然大小为0。

只有在得到API响应后,大小才会改变。

票数 1
EN

Stack Overflow用户

发布于 2018-03-15 11:41:10

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

如果您想打印Arraylist大小,然后在for循环之后打印它,

代码语言:javascript
复制
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大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49298367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档