首页 > 解决方案 > 在 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")
        })     

标签: androidkotlinandroid-livedatamutablelivedata

解决方案


您应该观察 Activity 或 Fragment 中的连接性变化。然后在每次回调更改时,您从 ViewModel 传递回调来处理此问题。而且您不需要使用wifiStatusListener 来观察变化。只需获取回调内部的属性即可处理。

请注意,您不应将应用程序上下文传递给 ViewModel。只需在活动中使用当前上下文。


推荐阅读