android - 使用 Dagger 在 Android mvp 上实现 GoogleApiClient?

标签 android dependency-injection android-6.0-marshmallow mvp dagger-2

我有几个问题,

首先,当我阅读一些文章时,我应该在 Activity 中实现 LocationListener、ConnectionCallback、OnConnectionFailedListener 接口(interface),

将这些类的实现分开放在不同的文件中是否正确?

喜欢下面吗?

public class LocationListener implements 
           com.google.android.gms.location.LocationListener {
@Inject
Location mLastLocation;
@Override
public void onLocationChanged(Location location) {
    // Assign the new location
    mLastLocation = location;
    // Displaying the new location on UI
 }
}

在我的 Activity 中处理 Showing the mLastLocation 属性是否正确?

//Fields
@Inject
GoogleApiClient client;
Location mLastLocation;
//Fields
  mLastLocation = LocationServices.FusedLocationApi.getLastLocation(client);

第二,provider的方法应该怎么写?,我的猜测是这样的,大家有什么推荐的吗?

//Constructor
public LocationModule(Context context, GoogleApiClient.ConnectionCallbacks callback, GoogleApiClient.OnConnectionFailedListener listener) {
    this.context = context;
    this.callback = callback;
    this.listener = listener;
}
@Provides
@Singleton
GoogleApiClient providesGoogleApi() {
    return new GoogleApiClient.Builder(context)
            .addOnConnectionFailedListener(listener)
            .addConnectionCallbacks(callback)
            .addApi(LocationServices.API)
            .build();
}

最后,我应该在哪里处理android 6及以上设备的权限?,是在view上,还是在presenter上?

听说View一定傻到不用测试,我该如何守住这个原则?

如果有人能给我一个引用,或 github 示例代码,与我的情况相匹配,那就太好了。

最佳答案

首先,您可以将 MVP View 层视为纯 Android 模块,这意味着与 Android 操作系统的任何通信(如请求权限)都必须使用该层处理,结果返回给展示者,展示者决定做什么接下来。

关于分离这些类的实现,我自己喜欢在寻找一些类的代码时分离类以获得更清晰的可视化!我认为没有人可以提出最佳实践建议,因为这取决于您的模块和实现。根据 Clean Code book,在这种类型的决策情况下,您必须更多地考虑代码的可读性。

最后,关于 LocationModule,这是完全正确的,但如果我处在你的位置,我什至会在更高级别的组件(例如 ApplicationComponent)中请求 Context 并将其从 LocationModule 构造函数中删除.

//Constructor
public LocationModule(GoogleApiClient.ConnectionCallbacks callback, GoogleApiClient.OnConnectionFailedListener listener) {
    this.callback = callback;
    this.listener = listener;
}

@Provides
@Singleton
GoogleApiClient providesGoogleApi(Context context) {
    return new GoogleApiClient.Builder(context)
            .addOnConnectionFailedListener(listener)
            .addConnectionCallbacks(callback)
            .addApi(LocationServices.API)
            .build();
}

上下文可以在更高的模块中使用它的相关提供者来提供。

这是一个示例代码库,它可以在这方面真正帮助您:

https://github.com/mmirhoseini/fyber_mobile_offers

关于android - 使用 Dagger 在 Android mvp 上实现 GoogleApiClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39860402/

相关文章:

android - 执行 webview.loadUrl() 时出现空指针异常

Android:听所有 toast

asp.net-core - 将 JwtBearerOptions 注入(inject) Controller

android - 如何在 Android M - API 23 中读取选定的模拟位置应用程序

android - android Marshmallow 应用程序中位置的权限问题

android-permissions - 由于拒绝权限,MediaScannerConnection在Android 6上失败

android - 创建快捷方式 : how can I work with a drawable as Icon?

安卓 + Wowza + RTSP。玩的不错,但是无法控制MediaController

java - 构建器模式与依赖注入(inject)(例如通过 Guice)

java - 打包 Spring 管理的 Axis2 Web 服务客户端