Ho un'attività che utilizza due caricatori. Ognuno di loro restituisce diversi tipi di dati. Per ottenere i dati da un singolo programma di caricamento uno implementa semplicemente LoaderCallbacks<D>
in un'attività. Immagino che potrei semplicemente implementare LoaderCallbacks<Object>
e controllare il tipo di oggetto e poi decidere quale dei due LoaderCallbacks è, ma mi sembra un trucco (soprattutto a causa della mancanza di sicurezza del tipo qui).LoaderCallbacks come classe interna statica (per gestire più caricatori con tipi di dati diversi restituiti)
Così ho pensato di fare le LoaderCallbacks oggetto di una classe interna statica, qualcosa di simile:
private static class geocoderLoaderCallbacks implements LoaderCallbacks<List<Address>>{
@Override
public Loader<List<Address>> onCreateLoader(int arg0, Bundle arg1) {
GeocoderTask loader = new GeocoderTask(context, "");
return loader;
}
@Override
public void onLoadFinished(Loader<List<Address>> loader, List<Address> data) {
// TODO Auto-generated method stub
}
@Override
public void onLoaderReset(Loader<List<Address>> loader) {
// TODO Auto-generated method stub
}
}
E quindi utilizzando lm.initLoader(0, null, geocoderLoaderCallbacks)
.
Due domande sorgono: è giusto fare o dovrei piuttosto limitarmi a implementare LoaderCallbacks in Activity? E come posso tranquillamente passare il contesto in onCreateLoader? Dovrei semplicemente creare un costruttore in geocoderLoaderCallbacks e passare il contesto in questo modo lm.initLoader(0, null, geocoderLoaderCallbacks(this))
?
C'è una domanda simile qui LoaderManager with multiple loaders: how to get the right cursorloader ma non spiega come gestire due caricatori con tipi di dati diversi.
Non sono sicuro di "mantenere i riferimenti statici o comunque memorizzati nella cache". Il contesto è necessario perché AsyncTaskLoader ne ha bisogno. Quindi devo passarlo a geocoderLoaderCallbacks. Ma dovrei istanziarlo nella mia attività e passare il riferimento a questa particolare attività? Non perderebbe l'attività? In tutte le implementazioni di esempio (dove Activity implementa LoaderCallbacks) usano 'lm.initLoader (0, null, this);' ('this') per passare il riferimento all'attività. Quindi è gestito automaticamente da AsyncTaskLoader. Ma funziona allo stesso modo con la classe interiore statica? –
Farlo in una classe diversa e passare il 'Context' è sicuro per quanto riguarda le perdite poiché la durata della callback del loader è legata alla durata dell'attività stessa. Una volta che l'attività è raccolta dei rifiuti, anche tutti i riferimenti in uscita da lì saranno. L'unica cosa che non devi fare è usare le variabili 'static' che hanno un qualche tipo di riferimento alla tua attività. Di solito non avrai problemi con le perdite se usi semplicemente le classi fornite come previsto. – zapl
Grande, grazie! E +1 per aver menzionato di non usare variabili statiche con riferimento all'attività –