AsyncTaskLoader no llama a onLoadFinished a menos que devuelva un nuevo objeto en loadInBackground
Tengo un AsyncTaskLoader<List<String>>
con una variable miembro List<String>
mAddresses. En loadInBackground
, si creo un nuevo objeto, lo relleno y lo devuelvo; onLoadFinished
se llama como se espera, así que puedo actualizar el adaptador que a su vez actualiza la vista.
public List<String> loadInBackground() { // ListView updates properly only if I do this (strange?) mAddresses = new ArrayList<String>(); // ... fill mAddresses ... return mAddresses; }
Sin embargo, si intento usar la misma variable incluso cuando es el valor cambia onLoadFinished
se llama:
- Explique AsyncTaskLoader
- Utilizar LoaderCallback sin Fragmento
- Actualizar la interfaz de usuario desde un AsyncTaskLoader
- Actualizar la barra de progreso de AsyncTaskLoader?
- AsyncTaskLoader no se ejecuta
public List<String> loadInBackground() { // ListView does not update with this! if(mAddresses == null) { mAddresses = new ArrayList<String>(); } // ... fill mAddresses ... return mAddresses; }
¿Puede alguien comentar sobre esto? ¿Se supone que debo crear un nuevo objeto para volver cada vez como esto? ¿Hay alguna bandera que puedo establecer que dice "el objeto ha cambiado, así que a pesar de que es el mismo objeto, asegúrese de que todas las actualizaciones se realizan?
- Cómo saber si AsyncTaskLoader se está ejecutando
- ¿Qué hace realmente AsyncTaskLoader.deliverResult ()?
- AsyncTaskLoader onLoadFinished con un cambio de tarea y configuración pendiente
- Android - Estrategia de grupo de subprocesos y Loader se puede utilizar para implementarlo?
- Androide. Yor propio progreso-bar?
- ¿Cómo funciona la cancelación de un AsyncTaskLoader?
- Diferencia real entre AsyncTask y Thread
- AsyncTaskLoader personalizado con caché
Si los datos ya están cargados (como parece en la variable 'mAddresses' que está en el Loader) debe llamar a forceLoad () para que vuelva a cargarse:
http://developer.android.com/reference/android/content/Loader.html#forceLoad%28%29
Editar: … después de alguna investigación … Para responder a su pregunta original, sin ayuda: "porque no"!
Desde el origen de LoaderManager:
// Notify of the new data so the app can switch out the old data before // we try to destroy it. if (mData != data || !mHaveData) { mData = data; mHaveData = true; if (mStarted) { callOnLoadFinished(loader, data); } }
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/app/LoaderManager.java#LoaderManagerImpl.LoaderInfo.onLoadComplete%28android.content .Loader% 2Cjava.lang.Object% 29
RE su problema, estoy asumiendo que usted está agregando continuamente a la lista en loadInBackground () en lugar de limpiar y comenzar de nuevo. La forma más limpia es crear una nueva ArrayList cada vez que pasa la lista existente como un argumento al constructor ArrayList (), copiará el contenido.
O puede anular deliverResult (), se llama desde el subproceso principal para modificar mAdapter es OK.
O olvidar el cargador y sólo tiene que utilizar un AsyncTask mucho más simple … aunque eso depende de dónde vienen realmente sus datos.
intente anular onStartLoading y llame a forceLoad ()
@Override protected void onStartLoading() { super.onStartLoading(); forceLoad(); } @Override protected void onStopLoading() { super.onStopLoading(); cancelLoad(); }
- QualComm Vuforia Realidad Aumentada
- En Android – ¿Cómo publicar directamente tweet a los siguientes usuarios de un usuario de autenticación en Android sin abrir Tweet diálogo (cuadro de diálogo Mensaje)