android - 在 Android 视图模型中的内部网络更改回调时 LiveData 未触发 - Kotlin
问题描述
尝试使用实时数据收听连接回调。回调“onAvailable”和“onLost”被触发,但 ViewModel 中的“postValue”没有被触发。当 AppViewModel 被初始化并且 init 只被调用一次时,它是第一次。当我将 postData 移到网络回调之外时,它会触发。任何帮助表示赞赏。
class AppViewModel(application: Application) : AndroidViewModel(application) {
private var connectivityManager =
application.applicationContext.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
var wifiStatusListener = MutableLiveData<Boolean>()
var callback: NetworkCallback =
object : NetworkCallback() {
override fun onAvailable(network: Network) {
wifiStatusListener.postValue(true) // never calls.
logI(TAG, "onAvailable ${network.describeContents()}")
}
override fun onLost(network: Network) {
wifiStatusListener.postValue(false) // never calls.
logE(TAG, "onLost ${network.describeContents()}")
}
}
init {
logI(TAG, "View Model Initialized")
viewModelScope.launch {
initWiFiStatusCheckListener()
}
}
// called from init in ViewModel
connectivityManager.registerDefaultNetworkCallback(callback)
在 Activity 中,这就是 View 模型的初始化方式。下面的日志第一次只调用一次
logI(TAG, "Wifi Listener $it")
appViewModel = ViewModelProvider(this).get(AppViewModel::class.java)
appViewModel.wifiStatusListener.observe(this, Observer {
logI(TAG, "Wifi Listener $it")
})
解决方案
您应该观察 Activity 或 Fragment 中的连接性变化。然后在每次回调更改时,您从 ViewModel 传递回调来处理此问题。而且您不需要使用wifiStatusListener
来观察变化。只需获取回调内部的属性即可处理。
请注意,您不应将应用程序上下文传递给 ViewModel。只需在活动中使用当前上下文。
推荐阅读
- javascript - 参数未传递给 ng-submit 上的函数
- c# - C# 我可以使用枚举作为 for 循环来代替 int
- css - visjs timeline change CSS on top
- reactjs - 无法在 React Navite 元素按钮中将值作为函数传递
- node.js - How pg-promise handles multiple clients in the same app
- powershell - Compare dates from a string in PowerShell
- c++ - 捕获到 SYCL 异常:错误:[ComputeCpp:RT0101] 无法创建内核((内核名称:SYCL_class_multiply))
- sql-server - 如何使用 Docker 和 Docker Compose 从备份开始自动创建和运行“干净”的 SQL Server 数据库?
- java - 在 Ubuntu 中通过 Java 执行 bash 命令
- javascript - 在 React 组件状态下修改数组中特定项目的最舒适/传统方法是什么?