繁体   English   中英

重新填充ArrayList之后的IndexOutOfBoundsException(仅棉花糖)

[英]IndexOutOfBoundsException after repopulating ArrayList (Marshmallow only)

我的设置如下:在onCreate内,我初始化一个ArrayList,如下所示:

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

// unrelated code ...

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

然后AsyncTask通过HttpURLConnection()获取文本,使用JsonReader解析json,并将每一行文本添加到textList中(所有这些都发生在AsyncTask的doInBackground内部。我有一个自定义适配器,用于显示textList的字符串。

我还有一个函数gotoNextSection() ,当用户想要导航到下一页时,将触发该功能,我在其中执行以下操作:

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

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

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";
        }
    }

以便arrayList为空并准备重新填充。 所有这些在所有其他受支持的Android版本中都可以正常工作,但是当我在棉花糖模拟器中gotoNextSection()导致IndexOutOfBoundsException。 在将新内容添加到刚清除的arrayList(通过日志验证)之后,就会发生这种情况,因此我认为这不是竞争条件。 请注意,不清除列表可防止异常,并且由于这是活动中使用的唯一ArrayList,因此我肯定.clear()是问题所在。 在尝试启动AsyncTask之前,我也尝试过将其清空并重新初始化,但无济于事。 同样,这仅发生在Android 6.0上。 有什么想法吗?

编辑:这是logcat stacktrace。 请注意,它尝试访问的索引的大小以及在代码中出现的位置无关紧要,因为在gotoNextSection执行任务后,我尝试登录ArrayList,这只是我尝试使用的任何索引的例外访问日志。

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
        at java.util.ArrayList.get(ArrayList.java:308)
        at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
        at android.widget.ListView.dispatchDraw(ListView.java:3329)
        at android.view.View.draw(View.java:16181)
        at android.widget.AbsListView.draw(AbsListView.java:4142)
        at android.view.View.updateDisplayListIfDirty(View.java:15174)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
        at android.view.View.updateDisplayListIfDirty(View.java:15134)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
        at android.view.Choreographer.doCallbacks(Choreographer.java:670)
        at android.view.Choreographer.doFrame(Choreographer.java:606)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

已解决:我最终不得不在调用clear并随后在postExecute()中重新连接之前将适配器与ListView断开连接,我猜棉花糖对数据绑定的要求更高

暂无
暂无

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

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