2011-09-19 1220 views
8

Al usar un AsyncTaskLoader personalizado para descargar datos de un servicio web, si presiono el botón INICIO en el medio del proceso de carga y luego vuelvo a ingresar la aplicación, el inicio de carga en línea () método no es llamado. Mi fragmento llama al setRetainInstance(true) en onActivityCreated() y también llama al getLoaderManager.initLoader(0, null, this) en el mismo método (como se recomienda).onLoadFinished no se ha llamado después de regresar de un botón INICIO presione

Durante la prueba, veo que al volver al fragmento onActivityCreated() no se llama, por lo que puede que onLoadFinished() no se invoque. ¿Pero dónde más poner el método initLoader()? He leído en varios lugares que no debe llamarse al onResume().

¿Alguna idea? Tengo muchos cargadores en varias pantallas en mi aplicación y necesito resolver este problema de una manera elegante.

+0

¿Dónde has leído 'initloader' no debería ser llamado en 'onResume()' porque eso es exactamente lo que se necesita para solucionar un error de marco https://code.google.com/p/android/issues/detail?id=63179 – faizal

+0

@faizal Realmente no recuerdo. Me he alejado del uso de cargadores hace mucho tiempo. Muchos desarrolladores expertos recomiendan por experiencia contra el uso de cargadores para obtener datos de red. –

Respuesta

22

Después de mirar Edición 14944 (http://code.google.com/p/android/issues/detail?id=14944), he resuelto el problema reemplazando onStartLoading() en mi costumbre AsyncTaskLoader y llame forceLoad().

Una mejor solución es crear una matriz de encargo AsyncTaskLoader que se parece a esto (tomado de una sugerencia de alexvem desde el siguiente enlace):

public abstract class AsyncLoader<D> extends AsyncTaskLoader<D> { 

    private D data; 

    public AsyncLoader(Context context) { 
     super(context); 
    } 

    @Override 
    public void deliverResult(D data) { 
     if (isReset()) { 
      // An async query came in while the loader is stopped 
      return; 
     } 

     this.data = data; 

     super.deliverResult(data); 
    } 


    @Override 
    protected void onStartLoading() { 
     if (data != null) { 
      deliverResult(data); 
     } 

     if (takeContentChanged() || data == null) { 
      forceLoad(); 
     } 
    } 

    @Override 
    protected void onStopLoading() { 
     // Attempt to cancel the current load task if possible. 
     cancelLoad(); 
    } 

    @Override 
    protected void onReset() { 
     super.onReset(); 

     // Ensure the loader is stopped 
     onStopLoading(); 

     data = null; 
    } 
} 
+0

Resuelto para mí anulando onStartLoading() y llamando a forceLoad() en él. – sandy

Cuestiones relacionadas