【问题标题】:Observing network change inside fragment using LiveData使用 LiveData 观察片段内的网络变化
【发布时间】:2020-11-24 09:49:54
【问题描述】:

我希望监控我是否连接到特定的 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")
        })
    }

}

SharedViewModel:

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) {
        }
    }
}

【问题讨论】:

  • 是没有收到networkCallback,还是viewModel没有更新的问题?
  • 收到网络回调,viewModel 没有更新。
  • 请添加android-livedata标签
  • @Metrier,你的链接是我的问题。并且犯了同样的错误。谢谢!

标签: android


【解决方案1】:

发现问题:

需要使用:

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

安装于:

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

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多