注入GoogleApiClient

时间:2016-03-15 10:58:10

标签: android dagger dagger-2

我想在项目的不同部分注入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();
    }

1 个答案:

答案 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);
}

请注意更改:

  1. @Named(..)已经是一个范围,因此您应该删除@Singleton - 这不是必需的。
  2. 两种提供者方法需要以不同的方式命名(provideLocationClientprovideGeodataClient
  3. 该模块返回GoogleApiClient
  4. ,而不是返回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()