2016-03-15 1 views
5

Je veux injecter des instances de client API Google dans différentes parties de mon projet, mais je n'ai pas réussi à le faire fonctionner.Injection de GoogleApiClient

@Provides @Named("geodata_api") 
    @Singleton 
    GoogleApiClient providesGoogleApiClient(Context context) { 
      return new GoogleApiClient.Builder(context) 
        .addApi(Places.GEO_DATA_API) 
        .build(); 
     } 

@Provides @Named("location_api") 
    @Singleton 
    GoogleApiClient providesGoogleApiClient(Context context) { 
     return new GoogleApiClient.Builder(providesContext()) 
       .addApi(LocationServices.API) 
       .build(); 
    } 
+0

Aucun point d'interrogation "?", Vous ne posez pas de question. Plus de détails nécessaires. qu'est-ce qui échoue exactement et quels diagnostics sont donnés? –

+0

La même question a été posée il ya quelques jours: http://stackoverflow.com/q/35972868/1837367 –

+0

"Je n'ai pas réussi à le faire fonctionner" -> * Qu'est-ce qui ne fonctionne pas? Pourriez-vous poster l'erreur? –

Répondre

3

Le problème est que Dagger ne serait pas en mesure de fournir les callbacks, puisque les callbacks sont les détails de mise en œuvre, et non pas les dépendances - et les callbacks sont généralement mis en avant la construction du client (voir l'option 2 ci-dessous pour plus d'informations sur les rappels).

Une option serait d'avoir Dagger fournir le GoogleApiClient.Builder, puis votre mise en œuvre doit terminer la chaîne en définissant les callbacks et appelant build():

@Provides 
@Named("location_api") 
GoogleApiClient.Builder provideLocationClient(Context context) { 
    return new GoogleApiClient.Builder(context) 
      .addApi(LocationServices.API); 
} 

@Provides 
@Named("geodata_api") 
GoogleApiClient.Builder provideGeodataClient(Context context) { 
    return new GoogleApiClient.Builder(context) 
      .addApi(Places.GEO_DATA_API); 
} 

Notez les changements:

  1. @Named(..) est- déjà une portée, donc vous devriez laisser tomber le @Singleton - ce n'est pas nécessaire.
  2. Les deux méthodes de fournisseur doivent être nommés différemment (provideLocationClient, provideGeodataClient)
  3. au lieu de retourner le GoogleApiClient, le module renvoie une GoogleApiClient.Builder.

maintenant à utiliser cette dépendance, vous injecter le constructeur, puis fixez vos callbacks et construire le client:

@Inject @NamedScope("location_api") GoogleApiClient.Builder mLocationClientBuilder; 

... 

mComponent.inject(this); 
mClient = mLocationClientBuilder.<addCallbacks(...)>.build(); 
mClient.connect(); 

Lorsque se moquant de ce générateur en utilisant votre cadre moqueur test unitaire, une chose que vous » Il suffit de garder une référence au rappel et d'appeler la méthode de rappel onConnected(Bundle) lorsque connect() est appelée.


Une autre option est de fournir le GoogleApiClient comme vous, mais vous devez vous rappeler d'enregistrer vos callbacks avant de se connecter, et vous devez vous rappeler de désenregistrer ces callbacks lorsque vous avez terminé (pour éviter une mémoire fuite). Voir GoogleApiClient#registerConnectionCallbacks()