本例实现的 demo 效果是,创建一个全局的倒计时,然后在 Activity 中添加两个按钮,点击后可以切换 FragmentA 和 FragmentB。然后我们通过全局的自定义 LiveData 单例实现数据监听,切换 Fragment 后 Fragment 页面上会展示倒计时的剩余秒数
代码:
- 全局自定义 Livedata 代码
class GlobalLivedata : LiveData() {
val coundManager = CountDownManager()
val listener = object : OnDataChangeListener {
override fun change(data: String) {
postValue(data)
}
}
override fun onActive() {
super.onActive()
coundManager.setListener(listener)
}
override fun onInactive() {
super.onInactive()
coundManager.removeListener(listener)
}
companion object {
private lateinit var globalData: GlobalLivedata
fun getInstance(): GlobalLivedata {
globalData = if (::globalData.isInitialized) globalData else GlobalLivedata()
return globalData
}
}
}
复制代码
- 倒计时器代码较长只粘贴一部分,有兴趣可以到 github 去查看完整代码
private val listeners = mutableListOf()
init {
val countDown = object : CountDownTimer(2000 * 1000, 1000) {
override fun onTick(millisUntilFinished: Long) {
remainSecond–
callback(“剩余:${remainSecond} 秒”)
}
override fun onFinish() {
callback(“倒计时结束”)
}
}
countDown.start()
}
/**
- 循环遍历回调消息
*/
private fun callback(msg:String) {
for (listener in listeners){
listener.change(msg)
}
}
复制代码
- FragmentA、FragmentB 中监听倒计时状态
GlobalLivedata.getInstance().observe(viewLifecycleOwner,
{ t ->
inflate.findViewById(R.id.tv_fragmentA).text = “fragmenta:${t}”
})
复制代码
GlobalLivedata.getInstance().observe(viewLifecycleOwner,
{ t ->
inflate.findViewById(R.id.tv_fragmentB).text = “fragmentb:${t}”
})
复制代码
- 最终效果
最终效果ÿ