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 秒执行一次。

您似乎没有关于如何获取此消息列表的具体细节,但我希望这有助于展示一种在您获取列表后显示和递减列表的方法。