繁体   English   中英

使用 volley 库解析 JSON 数据的问题

[英]Problem in parsing JSON data using volley library

这是一个从 Internet 获取 JSON 数据的简单程序。 answerWithAsyncTask()是一个接口,可确保所有下载的数据仅在下载完成时添加到questionArrayList

错误:java.lang.IndexOutOfBoundsException:索引:1,大小:0

 private List<Question> questionList;
 protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

//Few findViewbyId's here. Ignoring them

        questionList = new QuestionBank().getQuestions(new answerWithAsyncTask() {
            @Override
            public void asyncMe(ArrayList<Question> questionArrayList) {

                questionTextview.setText(questionArrayList.get(currentQuestionIndex).getQuestionId());
            }
        });
                 updateQuestion();     //This is the newly added line
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.prev_button:
                updateQuestion();
                break;
        }
    }
    private void updateQuestion() {
        String question = questionList.get(1).getQuestionId();
        questionTextview.setText(question);
    }

更新这是我的getQuestions方法。

String url ="https://raw.githubusercontent.com/curiousily/simple-quiz/master/script/statements-data.json";
    private ArrayList<Question> questionArrayList= new ArrayList<>();

    public List<Question> getQuestions (final answerWithAsyncTask callback){
        JsonArrayRequest jsonArrayRequest =new JsonArrayRequest(Request.Method.GET, url, (String) null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        for(int i=0;i<response.length();i++){
                            Question question = new Question();
                            try {
                                question.setQuestionId(response.getJSONArray(i).getString(0));
                                question.setTorF(response.getJSONArray(i).getBoolean(1));
                                questionArrayList.add(question);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                        if(null != callback) callback.asyncMe(questionArrayList);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                    }
                });
        AppController.getInstance().addToRequestQueue(jsonArrayRequest);
        return questionArrayList;
    }

这是我的接口answerWithAsyncTask


public interface answerWithAsyncTask {
    void asyncMe(ArrayList<Question> arrayList);
}

您收到此错误是因为

 private List<Question> questionList;

是空的。 在您的第一个代码中,您没有收到任何错误,因为您没有调用 updateQuestion() 来尝试从空列表中获取数据。 错误在第二个代码中,因为它试图访问该空列表。 您的

 return questionArrayList;

没有将数据返回到 questionList。 在这里,您正在尝试进行接口回调,以正确实现它,请查看此答案并相应地更改您的代码, Java 接口回调

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM