我想在项目的不同部分注入Google api客户端的实例,但是我还没有设法让它工作。
@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 :(得分:3)
问题在于Dagger无法提供回调,因为回调是实现细节,而不是依赖关系 - 并且回调通常在构建客户端之前设置(有关回调的更多信息,请参阅下面的选项2)。
一种选择是让Dagger提供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);
}
请注意更改:
@Named(..)
已经是一个范围,因此您应该删除@Singleton
- 这不是必需的。 provideLocationClient
,provideGeodataClient
)GoogleApiClient
。GoogleApiClient.Builder
醇>
现在要使用该依赖项,您将注入构建器,然后附加回调并构建客户端:
@Inject @NamedScope("location_api") GoogleApiClient.Builder mLocationClientBuilder;
...
mComponent.inject(this);
mClient = mLocationClientBuilder.<addCallbacks(...)>.build();
mClient.connect();
使用单元测试模拟框架模拟此构建器时,您需要做的一件事是保持对回调的引用,并在调用onConnected(Bundle)
时调用connect()
回调方法。 / p>
另一种选择是按原样提供GoogleApiClient
,但是你必须记住在连接之前注册你的回调,并且你必须记住在你完成时取消注册这些回调(以防止记忆泄漏)。见GoogleApiClient#registerConnectionCallbacks()