Android: 如何实现一个不断更新队列消息的文本视图?
Android: How to implement a textview that is to be constantly updated with messages from a queue?
背景:
我的 Android 应用程序上有一个 textView,我想用从各种来源收到的消息更新它,例如网络调用 (retrofit2),或从函数调用返回的消息。
我知道我必须存储这些传入的消息,因为我可能会同时收到大约 20 条消息。我还想每隔几秒一条一条地查看这些消息,直到队列为空。
如果在空队列中收到新消息,它将立即发送到 Ui 进行更新。
在这种情况下,Handler 是否适合解决此问题? rxjava 或协程等其他东西呢?
创建包含 textview 的布局并添加适配器,然后将 textview 附加到适配器。
我希望你明白
如果您打算在 Kotlin 中工作,我强烈建议您学习 LiveData,它对于使您的 UI 与数据保持一致非常有用。
注意事项:
class SampleViewModel : ViewModel() {
private val _messages = MutableLiveData<List<Int>>()
val messages: LiveData<List<Int>>
get() = _messages
init {
_messages.value = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}
fun dropList(){
_messages.postValue(_messages.value?.dropLast(1))
}
}
这是一个视图模型的示例,为了简单起见,我使用了一个整数列表作为我的消息。
消息:A LiveData class,将在更新时更新我的文本视图。
_messages: MutableLiveData是LiveData的子class,主要用于setting/posting值,一般不在viewmodel外使用。
dropList() 将从消息列表中删除最后一个元素(即最新的)
这是我的 MainActivity
val viewModel = ViewModelProvider(this).get(SampleViewModel::class.java)
viewModel.messages.observe(this, Observer {
if (it.isNullOrEmpty()){
tv.text = "No messages"
} else {
tv.text = it[it.size - 1].toString()
}
})
GlobalScope.launch {
while (true){
delay(1000)
viewModel.dropList()
}
}
我在消息上设置了一个观察者,这样当我 post 给 _messages 一个新值时,它会用新值更新我的文本视图。
我使用 GlobalScope 运行 viewmodel 的 dropList 函数,因为它是一个很长的 运行ning 协程(在这种情况下无限长),因此它每 1 秒执行一次。
您似乎没有关于如何获取此消息列表的具体细节,但我希望这有助于展示一种在您获取列表后显示和递减列表的方法。
背景:
我的 Android 应用程序上有一个 textView,我想用从各种来源收到的消息更新它,例如网络调用 (retrofit2),或从函数调用返回的消息。
我知道我必须存储这些传入的消息,因为我可能会同时收到大约 20 条消息。我还想每隔几秒一条一条地查看这些消息,直到队列为空。
如果在空队列中收到新消息,它将立即发送到 Ui 进行更新。
在这种情况下,Handler 是否适合解决此问题? rxjava 或协程等其他东西呢?
创建包含 textview 的布局并添加适配器,然后将 textview 附加到适配器。 我希望你明白
如果您打算在 Kotlin 中工作,我强烈建议您学习 LiveData,它对于使您的 UI 与数据保持一致非常有用。
注意事项:
class SampleViewModel : ViewModel() {
private val _messages = MutableLiveData<List<Int>>()
val messages: LiveData<List<Int>>
get() = _messages
init {
_messages.value = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}
fun dropList(){
_messages.postValue(_messages.value?.dropLast(1))
}
}
这是一个视图模型的示例,为了简单起见,我使用了一个整数列表作为我的消息。
消息:A LiveData class,将在更新时更新我的文本视图。
_messages: MutableLiveData是LiveData的子class,主要用于setting/posting值,一般不在viewmodel外使用。
dropList() 将从消息列表中删除最后一个元素(即最新的)
这是我的 MainActivity
val viewModel = ViewModelProvider(this).get(SampleViewModel::class.java)
viewModel.messages.observe(this, Observer {
if (it.isNullOrEmpty()){
tv.text = "No messages"
} else {
tv.text = it[it.size - 1].toString()
}
})
GlobalScope.launch {
while (true){
delay(1000)
viewModel.dropList()
}
}
我在消息上设置了一个观察者,这样当我 post 给 _messages 一个新值时,它会用新值更新我的文本视图。
我使用 GlobalScope 运行 viewmodel 的 dropList 函数,因为它是一个很长的 运行ning 协程(在这种情况下无限长),因此它每 1 秒执行一次。
您似乎没有关于如何获取此消息列表的具体细节,但我希望这有助于展示一种在您获取列表后显示和递减列表的方法。