Android 哪些操作应该放到 ViewModel 中

更新日期: 2022-11-25 阅读次数: 1472 字数: 265 分类: Android

权限申请是否应该放到 ViewModel 中

有此疑问的原因是,我看到权限相关的操作,需要传入 Context 参数。

private fun isLocationPermissionGranted(): Boolean {
    return ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
        PackageManager.PERMISSION_GRANTED
}

而 Context 只能在 Activity / Fragment / View 中得到。

当然,也可以通过向 ViewModel 中函数传递 Context 参数来实现。 但这样存在风险,因为 ViewModel 的生命周期比 Activity / Fragment 要长, 对于需要长时间的操作,调用 Content 时,可能导致异常崩溃。

由此来看,其实蓝牙 BLE 相关操作也不应该放到 ViewModel 中。

scanResult.device.connectGatt(context, false, gattCallback)

这句话总结的很好:

Because ViewModel is/should be Businesslogic. Always think about testing (without Android device). Everything you are able to test > viewmodel. Everything UI relevanted stuff -> View.

Toast 等弹窗是否应该放到 ViewModel 中

确实不应该,因为也是跟 Android UI 相关的逻辑部分,可以采用监听 LiveData 的方式在 Activity / Fragment 中调用展示 Toast 的代码。

参考

  • https://github.com/android/architecture-components-samples/issues/48

tags: ViewModel

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式