Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


ListView aleatorio IndexOutOfBoundsException en Froyo

Tengo una aplicación con toneladas de descargas y estoy recibiendo mucho de este error:

16783 AndroidRuntime E java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 16783 AndroidRuntime E at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257) 16783 AndroidRuntime E at java.util.ArrayList.get(ArrayList.java:311) 16783 AndroidRuntime E at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:16 4) 16783 AndroidRuntime E at android.widget.ListView.dispatchDrawWithExcessScroll_Default(ListView.java:3 288) 16783 AndroidRuntime E at android.widget.ListView.dispatchDraw(ListView.java:3029) 16783 AndroidRuntime E at android.view.View.draw(View.java:6743) 16783 AndroidRuntime E at android.widget.AbsListView.draw(AbsListView.java:2549) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.View.draw(View.java:6743) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.View.draw(View.java:6743) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 16783 AndroidRuntime E at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 16783 AndroidRuntime E at android.view.View.draw(View.java:6743) 16783 AndroidRuntime E at android.widget.FrameLayout.draw(FrameLayout.java:352) 16783 AndroidRuntime E at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java :1885) 16783 AndroidRuntime E at android.view.ViewRoot.draw(ViewRoot.java:1407) 16783 AndroidRuntime E at android.view.ViewRoot.performTraversals(ViewRoot.java:1163) 16783 AndroidRuntime E at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 16783 AndroidRuntime E at android.os.Handler.dispatchMessage(Handler.java:99) 16783 AndroidRuntime E at android.os.Looper.loop(Looper.java:123) 16783 AndroidRuntime E at android.app.ActivityThread.main(ActivityThread.java:4627) 16783 AndroidRuntime E at java.lang.reflect.Method.invokeNative(Native Method) 16783 AndroidRuntime E at java.lang.reflect.Method.invoke(Method.java:521) 16783 AndroidRuntime E at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:8 58) 16783 AndroidRuntime E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 16783 AndroidRuntime E at dalvik.system.NativeStart.main(Native Method) 

Como se puede ver en el rastreo de pila, no hay una línea con mi código de seguimiento en él. Para reproducir esto, por suerte encontré un usuario con un Froyo (2,2 p7) y acabo de desplazarse por uno de los ListView en el código. Después de algún tiempo al azar, sólo se congeló con esta excepción. Esto sucede cada vez en un momento diferente.

Es un ListView con un EndlessAdapter detrás de él, simplemente añadiendo más y más filas. Al parecer, obtener este error cuando hago el "over-scroll", pero no puedo ni siquiera pensar en una manera de arreglar esto. Es bastante difícil de reproducir, pero con casi 200 usuarios en línea en cada momento, si siguen recibiendo este error que terminará por no utilizar la aplicación más.

Cualquier ayuda sería apreciada.

EDIT: Ha habido un problema similar con alguien con EndlessAdapter . Http://groups.google.com/group/cw-android/browse_thread/thread/4739ce05742841da/af59c779e99f5e23?lnk=gst&q=index#af59c779e99f5e23

Pero no es culpa de EndlessAdapter . Es culpa de Android.

  • Android cómo hacer animated setSelection () para listfragment?
  • ¿Por qué getView devuelve objetos convertView incorrectos en SeparatedListAdapter?
  • Cómo cambiar el color y la fuente en ListView
  • ¿Cómo usar el titular de la vista si el contenido personalizado de la fila listview es dinámico?
  • Sólo en algunos teléfonos, ListView no se actualiza después de notifyDataSetChanged ()
  • Cómo mostrar los contactos en un listview en Android para Android api 11+
  • ¿No puedo hacer clic en el ListView en android?
  • Android
  • 2 Solutions collect form web for “ListView aleatorio IndexOutOfBoundsException en Froyo”

    Después de un montón de tiempo comprobar el código fuente de Android y no entender este error que finalmente lo agrietó.

    El problema se produce con los teléfonos Samsung, tienen una implementación diferente en la funcionalidad de desplazamiento y que terminó lanzando esta excepción, ya que trató de seleccionar un pie de página / cabecera fuera de los límites (incluso cuando no hay vista de pie de página).

    La solución que he utilizado no es bonita, pero se detendrá este error de pasar de nuevo.

     class MyFixedListView extends ListView { @Override protected void dispatchDraw(Canvas canvas) { try { super.dispatchDraw(canvas); } catch (IndexOutOfBoundsException e) { // samsung error } } } 

    Ahora uso esta implementación ListView y el error se ha ido.

    Realmente espero que esto ayude a cualquiera que utilice adaptadores sin fin.

    El mismo problema ocurre en mi aplicación al realizar pruebas en las tabletas ICS. Sucede solo cuando tengo 11 elementos en la lista, cuando EndlessAdapter carga 10 elementos a la vez.

    Este es un problema de condición de carrera. El problema proviene de la actualización de marca keepOnAppending en el subproceso AsyncTask. Mientras que ListView accede a getCount en el subproceso UI andkeepOnAppending se establece en true, más tarde cuando llama a getView en el mismo subproceso UI andkeepOnAppending ya se restablece en doInBackground:

     @Override public int getCount() { if (keepOnAppending.get()) { return (super.getCount() + 1); // one more for // "pending" } return (super.getCount()); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (position == super.getCount() && keepOnAppending.get()) { if (pendingView == null) { pendingView = getPendingView(parent); executeAsyncTask(new AppendTask()); } return (pendingView); } return (super.getView(position, convertView, parent)); } class AppendTask extends AsyncTask<Void, Void, Exception> { @Override protected Exception doInBackground(Void... params) { Exception result = null; try { keepOnAppending.set(cacheInBackground()); } catch (Exception e) { result = e; } return (result); } @Override protected void onPostExecute(Exception e) { if (e == null) { appendCachedData(); } else { keepOnAppending.set(onException(pendingView, e)); } pendingView = null; notifyDataSetChanged(); } } 

    Como una corrección, cambié el código de AppendTask para que se mantenga keepOnAppending en el subproceso de interfaz de usuario, sólo cuando se agregan nuevos elementos al adaptador.

    Aquí está el código:

     class AppendTask extends AsyncTask<Void, Void, AppendTask.Result> { class Result { boolean status; Exception ex; public Result(Exception ex) { this.ex = ex; } public Result(boolean result) { this.status = result; } } @Override protected AppendTask.Result doInBackground(Void... params) { try { return new Result(cacheInBackground()); } catch (Exception e) { return new Result(e); } } @Override protected void onPostExecute(AppendTask.Result result) { if (result.ex == null) { appendCachedData(); keepOnAppending.set(result.status); } else { keepOnAppending.set(onException(pendingView, result.ex)); } pendingView = null; notifyDataSetChanged(); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.