2011-11-17 6 views
6

Tengo una FragmentActivity con una ViewPager en ella - esta ViewPager contiene tres ListViews - cada una destinada a tener sus propios adaptadores únicos (y conjuntos de datos únicos).Multiple AsyncTaskLoader en una sola actividad: ¿tiene que inicializarse cada cargador en onCreate?

Me gustaría utilizar AsyncTaskLoader para rellenar estos adaptadores, pero SOLAMENTE cuando se selecciona una vista determinada en ViewPager.

¿Es necesario iniciar un cargador en el método onCreate de la actividad? (Por debajo de código)

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_foo); 

    getSupportLoaderManager().initLoader(0, null, this); 
    getSupportLoaderManager().initLoader(1, null, this); 
    getSupportLoaderManager().initLoader(2, null, this); 
} 

O ¿es correcto llamar a llamar initLoader (...) de forma interactiva, como el resultado de un oyente para OnPageChangeListener.onPageSelected?

mPager.setOnPageChangeListener(new OnPageChangeListener() { 
    @Override 
    public void onPageSelected(int newPage) { 
     getSupportLoaderManager().initLoader(newPage, null, this); 
    } 

    ... 
} 

quiero evitar tener que realizar potencialmente 3 cargadores consumen tiempo por adelantado si el usuario puede solamente siempre mirar a la primera vista en el buscapersonas.

EDIT: ¿O sería un mejor diseño tener el ViewPager usar un Fragmento para cada vista, y cada fragmento sería responsable de administrar su propio cargador?

+0

Finalmente utilicé ViewPager con subclases de ListFragment (cada uno con su propio cargador, que se inició desde onCreateView), pero aún me gustaría saber si lo anterior es una buena opción o solo un desastre esperando suceder. – NPike

Respuesta

1

No recuerdo los detalles, pero al menos con la biblioteca de compatibilidad, si no llamo initLoader() de onCreate(), ciclo de vida de la cargadora se cometa un error, por lo que es posible que desee llamar desde onCreate() (podría ser fijo en la última versión, no han probado). IIRC, los fragmentos solo usan el LoaderManager de la actividad, por lo que los cargadores siempre son gestionados por la actividad. El uso de fragmentos generalmente hará que su código sea más limpio, así que migre a fragmentos si es posible.

1

Dado que ya está usando Fragmentos, le sugiero que use Fragmentos en su buscador de vistas. Lo hago y funciona mucho mejor. Entonces, de hecho, inicializarás un cargador por fragmento. Si estos fragmentos están relacionados, puede definir una extensión abstracta y poner allí una lógica de inicialización común, luego puede ampliar eso para crear un fragmento concreto

En su código anterior descubrí que la inicialización de cada cargador subsiguiente cancelará la ejecución del anterior incluso los ID son diferentes

+0

Acepté la respuesta de Nikolay Elenkov, pero terminé haciendo exactamente lo que describió en mi implementación real. – NPike

Cuestiones relacionadas