Beobachten der Netzwerkänderung innerhalb des Fragments mithilfe von LiveData

Nov 24 2020

Ich möchte überwachen, ob ich mit einer bestimmten SSID verbunden bin. In meiner Hauptaktivität initialisiere ich den Netzwerkwechsel und möchte das Ergebnis im Fragment beobachten, aber dies funktioniert nicht. Bei einem Netzwerkwechsel kann ich das Ergebnis nicht im Fragment erhalten.

Fragment:

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

Hauptaktivität:

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

Antworten

Dim Nov 25 2020 at 23:11

Das Problem gefunden:

Benötigt werden:

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

Anstelle von:

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