8

La mia configurazione è la seguente: dentro la mia onCreate ho inizializzare un ArrayList come segue:IndexOutOfBoundsException dopo ripopolamento ArrayList (Marshmallow solo)

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

// unrelated code ... 

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

e l'AsyncTask recupera testo tramite HttpURLConnection(), analizza il JSON utilizzando JsonReader, e aggiunge ogni riga di testo alla lista testi (tutto questo avviene all'interno del AsyncTask doInBackground. ho un adattatore personalizzato che consente di visualizzare le stringhe in textList.

ho anche una funzione di gotoNextSection() che viene attivato quando l'utente vuole n Navigate alla pagina successiva, dove faccio qualcosa di simile:

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

Tuttavia, dal momento che non voglio il testo viziata dalla pagina precedente a rimanere sullo schermo, faccio la seguente nel mio 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"; 
     } 
    } 

in modo che la listaAmerica sia vuota e pronta per essere ripopolata. Tutto questo funziona bene in tutte le altre versioni Android supportate, ma quando l'ho provato con un emulatore Marshmallow gotoNextSection() genera una IndexOutOfBoundsException. Questo si verifica dopo che il nuovo contenuto è stato aggiunto alla lista di array cancellata di recente (verificata tramite la registrazione), quindi non penso che sia una condizione di competizione. Si noti che non cancellare l'elenco impedisce l'eccezione e poiché questo è l'unico ArrayList utilizzato nell'attività, sono sicuro che il problema è il .clear(). Ho provato a nullare e reinizializzarlo prima di lanciare AsyncTask come alternativa, inutilmente. Ancora, questo accade esclusivamente su Android 6.0. Pensieri?

MODIFICA: Ecco lo stacktrace logcat. Si noti che la dimensione dell'indice a cui sta tentando di accedere e dove si trova questo codice è irrilevante perché ho provato a registrare ArrayList dopo che l'attività è stata eseguita in gotoNextSection e mi dà solo un'eccezione per qualsiasi indice che ho provato per accedere nel registro.

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

spettacolo logcat stacktrace –

+0

senza il logcat, non ne ho idea. un pensiero potrebbe essere che su 6.0 il metodo Clear() potrebbe essere stato modificato. proverei un alist.removeAll (alist) per vedere se è chiaro il problema, e in caso affermativo, lo segnalerei a google come Android M è ancora in proview e non è ancora disponibile un rilascio stabile. – CptEric

+0

cosa è sectionId? – Pavya

risposta

4

risolto: ho finito per dover staccare l'adattatore dalla ListView prima di chiamare chiaro e ricollegarlo in seguito a postExecute(), sto cercando di indovinare Marshmallow è più severa sull'associazione dati

+0

Perché non utilizzare RecyclerView? Come mai sviluppi per M, ma usi ancora ListView? – Mike

Problemi correlati