¿Es el hilo de ArrayAdapter seguro en android? Si no, ¿qué puedo hacer para que sea seguro?

Digamos que extiendo ArrayAdapter y en el código donde estoy getView(int i, View v, ViewGroup g) , recupero el elemento actual usando getItem(i) . ¿Puedo estar seguro de que getItem(i) devolverá un elemento aunque otros hilos manipulen el mismo ArrayAdapter ?

No estoy seguro, pero creo que la respuesta es no. Si es así, ¿qué sugieres que haga para que sea seguro para hilos?

No es una cuestión de ArrayAdapter ser hilo seguro. ListView y otros widgets de interfaz de usuario que funcionan con un adaptador no permiten que el contenido del adaptador cambie inesperadamente en ellos. Y esto es más que sólo debido a otros hilos – que necesita para decirle a ListView sobre el cambio que realice antes de que el próximo intenta interactuar con su adaptador.

Si permite que otro subproceso modifique el adaptador o lo modifique en el subproceso principal pero no le diga a ListView sobre el cambio antes de permitir que suceda nada más, aleatoriamente (debido a razas) obtendrá excepciones lanzadas por ListView sobre el cambio del adaptador inesperadamente.

En el caso específico de ArrayAdapter si utiliza la API para modificar su contenido, se encargará de indicar la vista de lista sobre el cambio. Sin embargo, debe realizar estos cambios en el subproceso principal para asegurarse de que la vista de lista no intenta tener acceso al adaptador entre el punto en el que se realiza el cambio y la vista de lista se le informa sobre ese cambio.

Si usted está haciendo solamente cambios simples a ArrayAdapter (agregar y quitar algunos artículos), entonces usted será fino pero usted debe hacer éstos en el hilo principal.

Para cambios más significativos (como por ejemplo que el adaptador obtenga un nuevo conjunto de datos debido a una búsqueda de nuevos datos de un servidor), considere no usar ArrayAdapter y en su lugar implementar su propia subclase de BaseAdapter. ArrayAdapter está diseñado para situaciones en las que tiene un pequeño conjunto simple y estático de datos para mostrar situaciones simples. Para cosas más complicadas, probablemente estarás más feliz implementando BaseAdapter y haciendo la administración de datos tú mismo.

La forma típica en que un adaptador se actualiza en estas situaciones complicadas es que un hilo de fondo genera el nuevo conjunto de datos y una vez que está disponible entonces en el hilo principal se cambia al adaptador atómicamente con una llamada a notifyDataSetChanged () Saber que los datos han cambiado.

Así que digamos que está mostrando algunos datos que son una matriz de objetos MyItem. Mantenga sus datos en una matriz de juegos:

 ArrayList<MyItem> 

Implementar una subclase de BaseAdapter que muestre esta lista:

 class MyAdapter extends BaseAdapter<MyItem> { ArrayList<MyItem> mItems; public int getCount() { return mItems != null ? mItems.size() : 0; } public MyItem getItem(int position) { return mItems.get(i); } ... } 

Y ahora aquí es una función que podría implementar en el adaptador que se puede llamar desde otro hilo para proporcionar un nuevo conjunto de datos que se mostrará:

  final Handler mHandler = new Handler(); void setDataFromAnyThread(final ArrayList<MyItem> newData) { // Enqueue work on mHandler to change the data on // the main thread. mHandler.post(new Runnable() { @Override public void run() { mItems = newData; notifyDataSetChanged(); } }); } 

Por supuesto si usted está utilizando AsyncTask para hacer su generación de datos esto ya tiene una facilidad conveniente para realizar ese trabajo de nuevo en el hilo principal. Del mismo modo, podría utilizar la nueva instalación de Loader para cuidar la generación en segundo plano.

Y si todavía desea utilizar ArrayAdapter, en su función anterior podría hacerlo borrando los datos actuales y agregando los nuevos datos al adaptador ahora vacío. Esto es sólo más sobrecarga que realmente no le gana nada.

El adaptador de matriz no es seguro para hilos. He visto que se bloquea debido a problemas de concurrencia. El adaptador de matriz sólo traducirá su matriz a una vista en el subproceso principal (GUI). Así que si usted tiene cuidado de sólo cambiar la matriz (añadir o eliminar) en el hilo principal, entonces usted puede asegurarse de que sólo cada ejecución en 1 hilo.

  • Equivalente a javax.swing.Timer en Android
  • Android Video View en otro hilo y problema con android 2.1
  • ¿La publicación de Runnable a un hilo de interfaz de usuario garantiza que el diseño esté terminado cuando se ejecuta?
  • Android: aumenta AlertDialog desde el subproceso de fondo
  • Patrón de bloqueo de múltiples hilos de SQLiteDatabase
  • Cómo actualizar barra de progreso mediante el tema
  • ¿Cuál es la forma correcta de utilizar AudioTrack en modo estático?
  • Dibujo de lienzo SurfaceView de Android con un hilo
  • Después de ASyncTask.execute () do x () de Activity
  • DoInBackground tarda mucho en comenzar
  • Android sincronizado onSensorChanged?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.