【发布时间】:2020-07-28 07:09:20
【问题描述】:
作为 kotlin 和 mvvm 架构的新手,我浪费了过去两天来寻找这个问题的答案,但没有任何成功。所以我正在寻找一个干净的解决方案来更改片段 ui(在我的情况下它只是一个文本视图),当设备在互联网上连接/断开时。我正在使用 mvvm 架构和 android 架构组件(viewmodels、livedata、数据绑定......)。我有一个带有底部导航和多个片段的基本活动。
我正在尝试从自定义广播接收器获取连接事件,并且我想以某种方式在视图模型或我的片段中传递该事件。
我的第一个想法是使用界面。此接口由广播接收器的 onreceive 触发,并在我的片段或视图模型中实现,因此当互联网事件发生时,文本视图在我的片段中更新。但是我不确定如何在广播接收器中使用该接口,或者我不知道这是否可行或一个好的做法。
到目前为止我所做的是创建广播接收器
class ConnectionStateObserver: BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) {
//somehow use the interface in here
}
}
在我的基础活动中注册/注销它
override fun onResume() {
super.onResume()
val broadcastIntent = IntentFilter()
broadcastIntent.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(ConnectionStateObserver(), broadcastIntent)
}
override fun onPause() {
super.onPause()
unregisterReceiver(ConnectionStateObserver())
}
(我知道 ConnectivityManager.CONNECTIVITY_ACTION 已被弃用,但我找不到更好的解决方案)。
创建接口
interface ConnectionStatusChange{
fun onChange()
}
并在我的 Fragment 中实现接口
class myFragment : Fragment(), ConnectionStatusChange {
override fun onChange() {
// do the ui changes here
}
}
我想知道这种方法是否是一种好的做法,以及如何使其发挥作用。如果不可能这样做,请给我一些建议(代码总是很感激!=))。此外,最好有一个现代的,而不是 5 年前的解决方案。提前谢谢你。
【问题讨论】:
-
尝试使用观察者模式。如果您的堆栈中有 android 架构组件,则可以使用 LiveData。或者 RxJava 作为替代。例如,您可以保存应用程序级别的 MutableLiveData 值,在 BroadcastReceiver 中更改它并观察 Fragments 中的更改。
-
如果我的片段视图模型中有一个 MutableLiveData 变量,我如何从 BroadcastReceiver 访问它,因为我在 BroadcastReceiver 中没有视图模型的实例?
-
我讲述了应用程序级别的 MutableLiveData(自定义应用程序类中的字段),而不是片段 ViewModel。
标签: android android-fragments kotlin mvvm broadcastreceiver