重新填充ArrayList后的IndexOutOfBoundsException(仅限Marshmallow)

时间:2015-08-24 07:04:06

标签: java android arraylist android-asynctask android-6.0-marshmallow

我的设置如下:在我的onCreate中,我按如下方式初始化一个ArrayList:

textList = new ArrayList<HashMap<String, String>>();

// unrelated code ...

if (isConnected()) {
    new DisplayTextTask().execute(sectionId);
}

并且AsyncTask通过HttpURLConnection()获取文本,使用JsonReader解析json,并将每行文本添加到textList(所有这些都发生在AsyncTask&#39; s {{1}中我有一个自定义适配器,它在doInBackground中显示字符串。

我还有一个函数textList,当用户想要导航到下一页时会触发该函数,我会执行以下操作:

gotoNextSection()

但是,由于我不希望上一页中的陈旧文本保留在屏幕上,因此我在AsyncTask中执行以下操作:

gotoNextSection() {
    if (isConnected()) {
        new DisplayTextTask().execute(sectionId+1);
    }
}

以便arrayList为空并准备重新填充。 所有这些在所有其他受支持的Android版本中运行良好,但是当我在Marshmallow模拟器private class DisplayTextTask extends AsyncTask<String, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); textList.clear(); } @Override protected String doInBackground(String... urls) { // json parsing is called in getData() try { return getData(urls[0]); } catch (IOException e) { return "Could not load text"; } } 中尝试它时会导致IndexOutOfBoundsException。这在新内容添加到刚清除的arrayList后发生(通过记录验证),所以我不认为它是一种竞争条件。请注意,不清除列表会阻止该异常,因为这是活动I中使用的唯一ArrayList,gotoNextSection()是问题所在。在启动AsyncTask作为替代方案之前,我已尝试将其归零并重新初始化,但无济于事。 同样,这只发生在Android 6.0上。想法?

编辑: 这是logcat堆栈跟踪。请注意,它尝试访问的索引大小以及代码中出现的位置无关紧要,因为我在.clear()执行任务后尝试记录ArrayList并且它只是给出了对于我试图在日志中访问的任何索引,我都是例外。

gotoNextSection

1 个答案:

答案 0 :(得分:4)

解决:我在调用clear之前必须断开适配器与ListView的连接,然后在postExecute()中重新连接它,我猜测Marshmallow对数据绑定更严格