8

我的設置如下:裏面我的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) 
+0

顯示logcat的堆棧跟蹤 –

+0

沒有logcat,我沒有線索。一個想法可能是在6.0上,Clear()方法可能已經改變。我會嘗試一個alist.removeAll(alist)來查看是否清除問題,如果是的話,會將它報告給谷歌,因爲android M仍然在進行測試,並且還沒有穩定版本。 – CptEric

+0

sectionId是什麼? – Pavya

回答

4

解決:我最後不得不打電話清楚之前斷開的ListView適配器和postExecute()後重新連接,我猜棉花糖更嚴格的有關數據綁定

+0

爲什麼不使用RecyclerView?你爲什麼開發M,但你仍然使用ListView? – Mike