Android 哪些操作应该放到 ViewModel 中

文章目录

    权限申请是否应该放到 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

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式