微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 注入GoogleApiClient

我想在我的项目的不同部分注入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();
    }
最佳答案
问题是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.

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

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

原文地址:https://www.jb51.cc/android/429961.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐