注入GoogleApiClient

geo*_*_mx 5 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();
        }
Run Code Online (Sandbox Code Playgroud)
  @Provides @Named("location_api")
    @Singleton
    GoogleApiClient providesGoogleApiClient(Context context) {
        return new GoogleApiClient.Builder(providesContext())
                .addApi(LocationServices.API)
                .build();
    }
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 4

问题是 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);
}
Run Code Online (Sandbox Code Playgroud)

请注意更改:

  1. @Named(..)已经是一个范围,所以你应该删除@Singleton-- 它不是必需的。
  2. 两个提供程序方法需要以不同的方式命名 ( provideLocationClient, provideGeodataClient)
  3. 该模块没有返回GoogleApiClient,而是返回GoogleApiClient.Builder

现在要使用该依赖项,您将注入构建器,然后附加回调并构建客户端:

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

...

mComponent.inject(this);
mClient = mLocationClientBuilder.<addCallbacks(...)>.build();
mClient.connect();
Run Code Online (Sandbox Code Playgroud)

当使用单元测试模拟框架模拟此构建器时,您必须做的一件事是保留对回调的引用,并在调用时调用onConnected(Bundle)回调方法。connect()


另一种选择是按原样提供GoogleApiClient,但是您必须记住在连接之前注册回调,并且必须记住在完成后取消注册这些回调(以防止内存泄漏)。请参阅GoogleApiClient#registerConnectionCallbacks()