LiveData를 사용하여 프래그먼트 내부의 네트워크 변경 관찰

Nov 24 2020

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

답변

Dim Nov 25 2020 at 23:11

문제 발견 :

사용 필요 :

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

대신해서:

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