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:

  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?

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(); } 
  • Cómo manejar los errores en AsyncTaskLoader personalizado?
  • Datos fuera de sincronización entre un CursorLoader personalizado y un CursorAdapter respaldando un ListView
  • Volley o ASyncTaskLoader
  • Custom AsyncTaskLoader, loadinBackground no se llama después de 5 intentos
  • Prueba de AsyncTaskLoaders con Robolectric
  • Tipos incompatibles en el método onCreateLoader que trabaja con AsyncTaskLoader y Fragment
  • Cómo pasar params a Android AsnycTaskLoader
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.