gpt4 book ai didi

android - 在 android mvvm 架构中使用位置 api 的正确位置

转载 作者:太空狗 更新时间:2023-10-29 12:59:13 25 4
gpt4 key购买 nike

我有一个场景,我想向用户显示当前的天气数据,因为我正在获取他/她当前的纬度/经度并对其进行反向地理编码以获取城市名称。获得城市名称后,我将调用网络电话并显示天气数据。除此之外,我还需要执行许多定位操作。

所以我创建了一个名为 LocationUtils.kt 的类。我遵循 MVVM 架构,想知道调用 LocationUtils 方法的理想层是 view 层还是 viewmodel 层或 data 层。由于 FusedLocationProvider 需要 context,如果我在 ViewModel 中使用它,它会泄漏。那么如何解决这个问题呢?

LocationUtils.kt:

class LocationUtils {
private lateinit var fusedLocationClient: FusedLocationProviderClient

private fun isLocationEnabled(weakContext: Context?): Boolean {
return when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -> {
// This is new method provided in API 28
val locationManager = weakContext?.getSystemService(Context.LOCATION_SERVICE) as LocationManager
locationManager.isLocationEnabled
}
Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT -> {
// This is Deprecated in API 28
val mode = Settings.Secure.getInt(
weakContext?.contentResolver, Settings.Secure.LOCATION_MODE,
Settings.Secure.LOCATION_MODE_OFF
)
mode != Settings.Secure.LOCATION_MODE_OFF

}
else -> {
val locationProviders = Settings.Secure.getString(weakContext?.contentResolver, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)
return !TextUtils.isEmpty(locationProviders)
}
}
}

@SuppressLint("MissingPermission")
fun getCurrentLocation(
weakContext: WeakReference<Context>,
success: (String?) -> Unit,
error: () -> Unit
) {
if (isLocationEnabled(weakContext.get())) {
weakContext.get()
?.let { context ->
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
getCurrentCity(context, location, success)
}
}
} else {
error()
}
}

private fun getCurrentCity(
context: Context,
location: Location?,
success: (String?) -> Unit
) {
val city = try {
location?.let {
val geocoder = Geocoder(context, Locale.getDefault())
val address = geocoder.getFromLocation(it.latitude, it.longitude, 1)
address[0].locality
}
} catch (e: Exception) {
"Bangalore"
}
success(city)
}
}

最佳答案

我也在解决同样的问题。我还必须处理使用 MVVM 架构向用户显示天气数据的问题。此刻,我被困在你现在所在的同一点上。解决方案似乎是所谓的“依赖注入(inject)(DI)”。基本上,我们可以使用诸如“Dagger 2”之类的工具/框架将诸如 Context 之类的依赖项注入(inject)到我们的 ViewModel 中。与直接将 Context 传递给 ViewModel 相比,DI 的耦合度更低,并且更符合 MVVM。因此,FusedLocationProvider 的实际位置,IMO,将在 ViewModel 中,但在实现 DI 之后。也许其他人可以更好地阐述我的解释。一旦我自己实现依赖注入(inject),我将更新我的答案。

关于android - 在 android mvvm 架构中使用位置 api 的正确位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com