Android: Как реализовать просмотр текста, который должен постоянно обновляться сообщениями из очереди? - PullRequest
0 голосов
/ 15 апреля 2020

Справочная информация:

У меня есть textView в моем приложении Android, и я хочу обновить его сообщениями, полученными из различных источников, такими как сетевые вызовы (retrofit2), или сообщениями, возвращенными из вызовов функций .

Я знаю, что должен хранить эти входящие сообщения, потому что я мог бы получить около 20 сообщений одновременно. Я хочу также go просматривать каждое из этих сообщений по одному каждые несколько секунд до тех пор, пока очередь не станет пустой.

Если в пустую очередь приходит новое сообщение, оно немедленно отправляется в пользовательский интерфейс для обновления.

Будет ли обработчик в такой ситуации подходить для решения этой проблемы? А как насчет других вещей, таких как rx java или сопрограмм?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Если вы собираетесь работать в Kotlin, я настоятельно рекомендую изучить LiveData, это действительно полезно для обеспечения соответствия вашего пользовательского интерфейса вашим данным.

На этом примечании:

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))
    }
}

Вот пример модели представления, для простоты я использовал List of Ints в качестве сообщения.

messages: класс * LiveData , будет обновлять мой текстовый просмотр, когда он обновлено.

_messages: MutableLiveData является подклассом LiveData, который в основном используется для установки / публикации значения, как правило, не для использования вне модели представления.

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()
        }
    }

Я установил наблюдателя на сообщения, чтобы при отправке нового значения в _messages он обновлял мое текстовое представление с новое значение.

Я использовал GlobalScope для запуска функции dropList viewmodel, так как это долго выполняемая сопрограмма (в этом случае бесконечно), так что она будет выполняться каждую 1 секунду.

У вас, похоже, нет конкретные подробности того, как вы будете получать этот список сообщений, но я надеюсь, что это помогло показать один метод отображения и уменьшения списка после его получения.

0 голосов
/ 15 апреля 2020

Создание макета, содержащего текстовое представление и добавление адаптера, затем присоединение текстового просмотра к адаптеру. я надеюсь, вы понимаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...