android - 使用 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) {
}
}
}
解决方案
发现问题:
需要使用:
viewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
安装:
viewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
推荐阅读
- django - 使用 Wagtail API 从页面 slug 返回所有字段
- php - 使用 PHP 在 FTP 帐户上打开文本文件
- python - 如何将 buildbot 属性转换为字符串值
- c - 这个指定的约束是什么意思
- php - 过滤时的 Laravel 雄辩查询
- html - 两个三角形组成一个矩形
- ios - 如何缩短选择和移动组件的触摸时间?(使用 UICollectionViewDragDelegate)
- javascript - 正则表达式 - 仅完整的单词而不是特定字符之后
- elasticsearch - 在elasticsearch中定义icu变换的规则
- r - R将数据帧从长格式改造成宽格式?