2012-03-20 8 views
7

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.

risposta

9

È sempre corretto spostare il codice da una classe potenzialmente gigante ed è molto più pulito farlo con classi diverse, quindi con uno in grado di gestire tutto. Potresti anche voler renderli vere e proprie classi esterne invece di classi interne se ritieni che la tua attività contenga troppi codici all'interno. LoaderCallbacks è un'interfaccia in modo da poterla implementare per lo più nella propria classe.

Il passaggio del Context nel costruttore va bene fintanto che non si mantengono riferimenti statici o in qualche modo memorizzati nella cache.

+1

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? –

+1

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

+0

Grande, grazie! E +1 per aver menzionato di non usare variabili statiche con riferimento all'attività –

Problemi correlati