我有几个问题,
首先,当我阅读一些文章时,我应该在活动中实现LocationListener,ConnectionCallback,OnConnectionFailedListener接口,
在不同的文件中单独执行这些类是正确的吗?
如下所示?
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
}
}
我的活动中是否正确处理显示mLastLocation属性?
//Fields
@Inject
GoogleApiClient client;
Location mLastLocation;
//Fields
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(client);
第二,我应该如何为它编写提供者方法?,我的猜测是这样的,你们会推荐什么?
//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必须是如此愚蠢以至于你不需要测试它,我该如何保持这个原则?
如果有人可以给我一个参考,或github示例代码,这与我的案例相匹配,那将非常棒。
答案 0 :(得分:5)
最后,您可以将MVP视图层视为纯Android模块,这意味着与Android操作系统的任何通信(如请求权限)必须使用此层进行处理,结果将返回给演示者,该演示者决定如何操作下。
关于分离这些类的实现,当我在寻找一些类代码时,我自己喜欢将类分开以获得更清晰的可视化!我认为任何人都不能建议最佳实践,因为这取决于您的模块和实施。根据Clean Code一书,在这种类型的决策制定情况下,您必须更多地考虑您的代码可读性。
最后,关于 LocationModule ,这是完全正确的,但如果我在你的鞋子里,我甚至会在更高级别的Component(例如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();
}
可以使用它在更高模块中的相关提供者来提供上下文。
这是一个样本回购,可以在这方面真正帮助你: