2013-03-26 3 views
22

J'ai deux chargeurs personnalisés hérités de AsyncTaskLoader que je voudrais utiliser dans mon activité. Chacun d'entre eux renvoie un résultat de type différent. Pour utiliser mon activité pour un rappel que je dois mettre en œuvre deux interfaces:Plusieurs chargeurs dans la même activité

implements LoaderCallbacks<GetSyncListDataResult>, LoaderCallbacks<ErrorResult> 

Cependant, en essayant de mettre en œuvre des méthodes requises dans la même classe que je retrouve avec erreur de méthode double et d'effacement (???) Erreur:

// 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) ... 

De toute évidence, les méthodes sont incompatibles et j'ai besoin d'un moyen facile de résoudre ce problème. Quelle serait la bonne façon de résoudre cela?

+11

Ne pas mettre en œuvre les chargeurs. Vous ne pouvez implémenter qu'un seul chargeur. Au lieu de cela, vous devez déclarer vos LoaderCallbacks en tant que variables. LoaderCallbacks syncListCallbacks = nouveau LoaderCallbacks () {... méthodes ici}; – dymmeh

+1

OK, donc il serait préférable d'avoir une instance de classe anonyme interne dans la variable? – Dusan

+3

Oui. Puis démarrez votre chargeur en tant que getLoaderManager(). InitLoader (loaderId, bundle, syncListCallbacks); – dymmeh

Répondre

39

La bonne réponse est selon le commentaire de @ dymmeh, à savoir pas pour le Activity à mettre en œuvre deux interfaces LoaderCallbacks mais pour l'activité à contiennent deux LoaderCallbacks implémentations. A titre d'exemple: vos LoaderCallbacks champs initialise dans votre activité ...

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

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

... et déclarer vos ids chargeur ...

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

... puis vos chargeurs .. initialise

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

... Fait!

+4

J'ai une question. Le but de 'Activity' implémentant' LoaderCallbacks' et passant 'this' à la place de dataResultLoaderListener est de faire en sorte que' LoaderManager' agisse comme canal de communication entre 'Activity' et' Loader' via 'LoaderCallbacks'. Comment ce canal de communication est-il créé ici en tant que "Activity" n'implémente pas LoaderCallbacks mais plutôt en créant des classes internes anonymes? – AnV

+0

@AnV 'LoaderCallbacks' lui-même sont le canal de communication entre l'activité et le chargeur. Donc, les classes internes anonymes sont bien. –

-1

Ceci n'est pas nécessaire. Implémentez LoaderManager.LoaderCallbacks. Ensuite, chaque fois que vous initialisez un chargeur, donnez-lui un identifiant unique. Dans les rappels, vous pouvez détecter l'ID du chargeur qui a provoqué le rappel et prendre les mesures appropriées.

qui est

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: ... 
} 
... 

et ainsi de suite.

+12

Cette réponse est incorrecte car le type de retour des deux chargeurs (comme spécifié dans la question) est différent. –

+0

@AdilHussain que se passe-t-il si deux chargeurs sont des chargeurs personnalisés? –

+0

Excuses Amey mais je ne comprends pas votre question ni voir comment il est lié à la question originale dans ce fil. Ce sujet traite de l'interface 'LoaderManager.LoaderCallbacks' et de la configuration d'une activité pour écouter 2 chargeurs ayant des types de retour différents. –

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) { 

     } 
    } 
} 

Mon Github example

+1

Pourriez-vous fournir un peu plus d'explications avec votre réponse? Le code seulement est rarement aussi utile que le code + l'explication aux personnes qui rencontrent ceci. – Engineero

+0

Merci pour vos conseils et je viens d'ajouter quelques explications et espère que cela aide – Xianwei

Questions connexes