我的设置如下:在我的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
答案 0 :(得分:4)
解决:我在调用clear之前必须断开适配器与ListView的连接,然后在postExecute()中重新连接它,我猜测Marshmallow对数据绑定更严格