我的設置如下:裏面我的onCreate我初始化一個ArrayList如下:IndexOutOfBoundsException異常的ArrayList(僅棉花糖)
textList = new ArrayList<HashMap<String, String>>();
// unrelated code ...
if (isConnected()) {
new DisplayTextTask().execute(sectionId);
}
和的AsyncTask通過HttpURLConnection()
提取文本,解析使用JsonReader
的JSON,並增加了每行文本到文本清單(所有這一切都發生內的AsyncTask的doInBackground
。我有一個顯示的字符串textList
自定義適配器。
我也有一個功能gotoNextSection()
當用戶想要到n被觸發avigate到下一個頁面,在那裏我做這樣的事情:
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版本中都能正常工作,但是當我在Marshmallow模擬器gotoNextSection()
中嘗試它時,會產生IndexOutOfBoundsException。在新內容添加到新清理的arrayList(通過日誌記錄驗證)之後,會發生這種情況,所以我不認爲這是一個競爭條件。請注意,不清除列表會阻止異常,並且由於這是Activity中唯一使用的ArrayList,所以我認爲.clear()
是問題所在。我已經嘗試nulling並重新初始化之前啓動AsyncTask作爲替代以及,無濟於事。 同樣,這隻發生在Android 6.0上。想法?編輯: 這裏是logcat堆棧跟蹤。請注意,它嘗試訪問的索引的大小以及發生在代碼中的位置並不相關,因爲我在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)
顯示logcat的堆棧跟蹤 –
沒有logcat,我沒有線索。一個想法可能是在6.0上,Clear()方法可能已經改變。我會嘗試一個alist.removeAll(alist)來查看是否清除問題,如果是的話,會將它報告給谷歌,因爲android M仍然在進行測試,並且還沒有穩定版本。 – CptEric
sectionId是什麼? – Pavya