IndexOutOfBoundsException après le repeuplement de ArrayList (Marshmallow uniquement)

Ma configuration est la suivante: dans mon onCreate, j’initialise une ArrayList comme suit:

textList = new ArrayList<HashMap>(); // unrelated code ... if (isConnected()) { new DisplayTextTask().execute(sectionId); } 

et AsyncTask récupère le texte via HttpURLConnection() , parsing le JsonReader aide de JsonReader et ajoute chaque ligne de texte à la liste de textes (tout cela se passe à l’intérieur du doInBackground de l’ doInBackground . J’ai un adaptateur personnalisé qui affiche les chaînes dans textList .

J’ai aussi une fonction gotoNextSection() qui se déclenche lorsque l’utilisateur souhaite accéder à la page suivante, où je fais quelque chose comme:

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

Cependant, comme je ne veux pas que le texte périmé de la page précédente rest à l’écran, je procède comme suit dans ma tâche Async:

 private class DisplayTextTask extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); textList.clear(); } @Override protected Ssortingng doInBackground(Ssortingng... urls) { // json parsing is called in getData() try { return getData(urls[0]); } catch (IOException e) { return "Could not load text"; } } 

de sorte que la liste de tableaux est vide et prête à être remplie. Tout cela fonctionne bien dans toutes les autres versions d’Android sockets en charge, mais lorsque je l’ai essayé dans un émulateur Marshmallow, les résultats de gotoNextSection() donnent lieu à une exception IndexOutOfBoundsException. Cela se produit une fois que le nouveau contenu est ajouté à la liste arrayList récemment effacée (vérifiée via la journalisation), donc je ne pense pas que ce soit une situation de concurrence critique. Notez que ne pas effacer la liste empêche l’exception, et comme c’est la seule ArrayList utilisée dans l’activité, je suis .clear() que .clear() est le problème. J’ai essayé de l’annuler et de le réinitialiser avant de lancer AsyncTask comme solution de rechange également, en vain. Encore une fois, cela se produit exclusivement sur Android 6.0. Pensées?

EDIT: Voici le logcat stacktrace. Notez que la taille de l’index auquel il tente d’accéder et que cela se produit dans le code n’a pas d’importance, car j’ai essayé de consigner ArrayList après l’exécution de la tâche dans gotoNextSection et cela me donne simplement une exception pour l’index que j’ai essayé. accéder dans le journal.

 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) 

Résolu: j’ai fini par devoir déconnecter l’adaptateur de ListView avant d’appeler clear et de le reconnecter ensuite dans postExecute (), je suppose que Marshmallow est plus ssortingct sur la liaison de données