2013-03-26 32 views
22

Ho due caricatori costruite su misura ereditato dal AsyncTaskLoader che vorrei utilizzare nella mia attività. Ognuno di loro restituisce risultati di diverso tipo. Per utilizzare la mia attività per un callback devo implementare due interfacce:più caricatori nella stessa attività

implements LoaderCallbacks<GetSyncListDataResult>, LoaderCallbacks<ErrorResult> 

Tuttavia, cercando di attuare metodi richiesti nella stessa classe io alla fine con errore metodo di duplicazione e cancellazione (???) di errore:

// Methods for the first loader 
public Loader<GetSyncListDataResult> onCreateLoader(int ID, Bundle bundle) ... 
public void onLoaderReset(Loader<GetSyncListDataResult> loader) ... 
public void onLoadFinished(Loader<GetSyncListDataResult> loader, GetSyncListDataResult result) ... 

// Methods for the second loader 
public Loader<ErrorResult> onCreateLoader(int ID, Bundle bundle) ... 
public void onLoaderReset(Loader<ErrorResult> loader) ... 
public void onLoadFinished(Loader<ErrorResult> loader, ErrorResult result) ... 

Ovviamente, i metodi si scontrano e ho bisogno di un modo semplice come risolvere questo. Quale sarebbe il modo corretto di risolvere questo?

+11

non implementano i caricatori. È possibile implementare solo un singolo caricatore. Invece, dovresti dichiarare le tue LoaderCallback come variabili .. Es. LoaderCallbacks syncListCallbacks = new LoaderCallbacks () {...} metodi qui; – dymmeh

+1

OK, quindi sarebbe meglio avere un'istanza di classe anonima interna nella variabile? – Dusan

+3

Sì. . Poi avviare il loader come getLoaderManager() initLoader (loaderId, Fascio, syncListCallbacks); – dymmeh

risposta

39

La risposta corretta è come per un commento di @ dymmeh, vale a dire non per il Activity per implementare due interfacce LoaderCallbacks ma per l'attività di contengono due LoaderCallbacks implementazioni. A titolo di esempio: l'inizializzazione tuoi LoaderCallbacks campi nella vostra attività ...

private LoaderCallbacks<GetSyncListDataResult> dataResultLoaderListener 
    = new LoaderCallbacks<GetSyncListDataResult>() { ...methods here... }; 

private LoaderCallbacks<ErrorResult> errorResultLoaderListener 
    = new LoaderCallbacks<ErrorResult>() { ...methods here... }; 

... e dichiarare i propri ID caricatore ...

private static final int DATA_RESULT_LOADER_ID = 1; 
private static final int ERROR_RESULT_LOADER_ID = 2; 

... e poi inizializzare i tuoi caricatori ..

getLoaderManager().initLoader(DATA_RESULT_LOADER_ID, dataResultBundle, dataResultLoaderListener); 
getLoaderManager().initLoader(ERROR_RESULT_LOADER_ID, errorResultBundle, errorResultLoaderListener); 

... Fatto!

+4

Ho una domanda. Lo scopo di 'Activity' che implementa' LoaderCallbacks' e passa 'this' al posto di dataResultLoaderListener è quello di assicurare che' LoaderManager' agisca come canale di comunicazione tra 'Activity' e' Loader' tramite 'LoaderCallbacks'. In che modo il canale di comunicazione che viene creato qui come "Attività" non sta implementando "LoaderCallbacks", ma piuttosto crea classi interne anonime? – AnV

+0

@AnV 'LoaderCallbacks' sono di per sé il canale di comunicazione tra l'attività e il caricatore. Quindi le classi interne anonime vanno bene. –

-1

Questo non è necessario. Implementa LoaderManager.LoaderCallbacks. Quindi, ogni volta che si inizializza un caricatore, assegnargli un ID univoco. Nei callback, è possibile rilevare l'ID del caricatore che ha causato la richiamata e intraprendere l'azione appropriata.

cioè

class MyLoader extends Activity implements LoaderManager.LoaderCallbacks<GetSyncDataResult> { 
... 
private static final int LOADER1 = 1; 
private static final int LOADER2 = 2; 
... 
getLoaderManager().initLoader(LOADER1, null, this); 
... 
getLoaderManager().initLoader(LOADER2, null, this); 
... 

public Loader<GetSyncDataResult> onCreateLoader(int loaderId, Bundle args) { 

    switch (loaderId) { 

    case LOADER1: ... 
    case LOADER2: ... 
} 
... 

e così via.

+12

Questa risposta non è corretta come tipo di ritorno delle due pale (come specificato nella domanda) è differente. –

+0

@AdilHussain cosa succede se due caricatori sono caricatori personalizzati ?? –

+0

Scuse Amey, ma non capisco la tua domanda né vedere come si è legato alla domanda originale in questo thread. Questa discussione riguarda l'interfaccia 'LoaderManager.LoaderCallbacks' e come impostare un'attività per ascoltare 2+ caricatori con tipi di ritorno diversi. –

2
class YourActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks { 
// you still implements LoaderManager.LoaderCallbacks but without add <returnType> 
//and you have to cast the data into your needed data type in onLoadFinished() 

    Private int loader1 = 1; 
    private int loader2 =2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_detail); 

    getSupportLoaderManager().initLoader(REVIEW_LOADER, null, this); 
    getSupportLoaderManager().initLoader(REVIEW_LOADER, null, this); 
} 
    @Override 
    public Loader onCreateLoader(int id, Bundle args) { 
     if (id == loader1) { 

      //YourLoaderClass1 is you loaderClass where you implement onStartLoading and loadingInBackground() 
      return new YourLoaderClass1(); 
     } else if (id == loader2) { 

      return new YourLoaderClass2(); 
     } 
     return null; 
    } 

    @Override 
    public void onLoadFinished(Loader loader, Object data) { 
     int id = loader.getId();// find which loader you called 
     if (id == loader1) { 

      yourMethod1((List< >) data); // eg. cast data to List<String> 
     } else if (id == loader2) { 
      yourMethod1((String) data); // eg. cast data to String 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader loader) { 
     int id = loader.getId(); 
     if (id == loader1) { 

     } else if (id == loader2) { 

     } 
    } 
} 

mio Github example

+1

Puoi fornire qualche spiegazione in più con la tua risposta? Il codice è raramente utile come codice + spiegazione per le persone che si imbattono in questo. – Engineero

+0

Grazie per il tuo consiglio e aggiungo solo qualche spiegazione e spero che aiuti – Xianwei

Problemi correlati