首页 > 解决方案 > 使用 LiveData 观察片段内的网络变化

问题描述

我希望监控我是否连接到特定的 SSID。在我的主要活动中,我正在初始化网络更改并希望观察片段中的结果,但这不起作用,在网络更改时我无法获得片段中的结果。

分段:

class ConnectFragment : Fragment() {

    companion object {
        fun newInstance() = ConnectFragment()
    }

    private lateinit var viewModel: SharedViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.connect_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProvider(this).get(SharedViewModel::class.java)

        viewModel.connected.observe(viewLifecycleOwner, {
            Log.d(TAG, "Connected: $it")
        })
    }

}

共享视图模型:

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class SharedViewModel : ViewModel() {
    var connected= MutableLiveData(false)
}

主要活动:

class MainActivity : AppCompatActivity() {

    lateinit var viewModel:SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ViewModelProvider(this).get(SharedViewModel::class.java).also { viewModel = it }
    }

    override fun onSupportNavigateUp() =
        findNavController(this, R.id.navHostFragment).navigateUp()


    private val networkCallback: ConnectivityManager.NetworkCallback =
        object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                Log.d(TAG, "Network Available")
                super.onAvailable(network)

                viewModel.connected.postValue(isConnectedToSSID())
            }
        }

    private fun startNetworkCallback() {
        val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        connectivityManager.registerDefaultNetworkCallback(networkCallback)
    }


    private fun stopNetworkCallback() {
        val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        connectivityManager.unregisterNetworkCallback(networkCallback)
    }


    private fun isConnectedToSSID(): Boolean {

        val wifiManager = getSystemService(WIFI_SERVICE) as WifiManager
        val info = wifiManager.connectionInfo
        val ssid = info.ssid.replace("\"", "")
        return ssid.startsWith(WIFI_NETWORK) ?: false
    }

    override fun onResume() {
        super.onResume()
        startNetworkCallback()
    }

    override fun onPause() {
        super.onPause()
        try {
            stopNetworkCallback()
        } catch (e: Exception) {
        }
    }
}

标签: android

解决方案


发现问题:

需要使用:

viewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)

安装:

viewModel = ViewModelProvider(this).get(SharedViewModel::class.java)

推荐阅读