2016-03-15 62 views
5

我想在我的項目的不同部分注入Google API客戶端的實例,但是我沒有設法使其工作。注入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

沒有問號「?」,你不問問題。需要更多細節。什麼是失敗和給出了什麼診斷? –

+0

幾天前提出了同樣的問題:http://stackoverflow.com/q/35972868/1837367 –

+0

「我還沒有設法使它工作」 - > *什麼*不起作用?你能發佈錯誤嗎? –

回答

3

的問題是,匕首將無法提供回調,因爲回調的實現細節,而不是依賴 - 和回調正在構建的客戶端(前通常設置有關回調的更多信息,請參閱下面的選項2)。

一種選擇是有匕首提供GoogleApiClient.Builder,然後你的實現必須通過設置回調和調用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); 
} 

注意的變化:

  1. @Named(..)是已經是一個範圍,所以你應該放棄@Singleton - 這是不需要的。
  2. 這兩個供應商的方法需要有不同的名稱(provideLocationClientprovideGeodataClient
  3. 而不是返回GoogleApiClient,模塊返回一個GoogleApiClient.Builder

我們使用的依賴,你會注入建設者,然後附上您的回調,並建立客戶端:

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

... 

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

使用單元測試嘲諷框架嘲笑他建設者,有一件事你」必須保持對回調的引用,並調用connect()時調用onConnected(Bundle)回調方法。


另一種選擇是提供爲你是GoogleApiClient,但你要記住連接之前註冊的回調,你必須記住要註銷的回調時,你就大功告成了(以防止內存泄漏)。請參閱GoogleApiClient#registerConnectionCallbacks()