15

que tienen un fragmento, y desea iniciar un cargador cuando se hace clic en un botón:El cargador no se inicia después de llamar a initLoader()?

public class MyFragment extends Fragment { 

    public void onActivityCreated() { 
     super.onActivityCreated(); 

     Button btn = ...; 
     btn.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       getLoaderManager().initLoader(500, null, mMyCallback); 
      } 
     }); 
    } 

    private LoaderManager.LoaderCallbacks<String> mMyCallback = new LoaderManager.LoaderCallbacks<String>() { 

     @Override 
     public Loader<String> onCreateLoader(int arg0, Bundle arg1) { 
      Log.e(TAG, "LoaderCallback.onCreateLoader()."); 
      return new MyLoader(getActivity()); 
     } 
    } 
} 

public class MyLoader extends AsyncTaskLoader<String> { 
    public MyLoader(Context context) { 
     super(context); 
    } 

    @Override 
    public String loadInBackground() { 
     Log.e(TAG, "Hi, running."); 
     return "terrific."; 
    } 
} 

Después de hacer clic en el botón, puedo ver onCreateLoader método de devolución de llamada de mi nombre, pero el cargador creado comienza en realidad nunca. ¿Necesitamos llamar a forceLoad() en el cargador para que realmente comience? Ninguno de los mensajes de muestra hacer esto,

Gracias

Respuesta

2

que necesita para mantener una referencia a la instancia del cargador que se crea en el método onCreateLoader. Luego, para actualizarlo, llame al yourLoader.onContentChanged();

+0

OMG, literalmente has solucionado todo mi problema. – Alex

32

Debe implementar onStartLoading() y llamar al forceLoad() en algún lugar del método.

Ver este post para más información: Implementing Loaders (part 3)

+0

Esto realmente funcionó. ¡Gracias! – Roboblob

+0

¿Qué debería implementar en el método forceLoad()? –

+0

@Manikanta Mi respuesta dice que debe _call_ 'forceLoad()', no implementarlo. –

2

Si usted tiene más de 1 cargador de la misma actividad, asegúrese de que su identificación es diferente. He perdido unas horas para averiguarlo :)

3

Tres puntos importantes con respecto a cargadoras son:

  1. Usar siempre forceLoad() método de inicialización mientras cargadoras. Por ejemplo:

    getLoaderManager().initLoader(500, null, mMyCallback).forceLoad(); 
    
  2. Siempre implementar onStartLoading(). Esta función se llamará automáticamente por LoaderManager cuando se inicie el fragmento/actividad asociado.

  3. Asegúrese de que el ID del cargador sea único, de lo contrario no se ejecutará el cargador nuevo.

Si todavía hay un problema se puede comprobar el estado del cargador llamando al método isStarted().

Cuestiones relacionadas