Как решить "Только оригинальный поток, создавший иерархию представлений, может касаться его представлений" в Kotlin? - PullRequest
0 голосов
/ 22 февраля 2019

Этот код взят из довольно сложной кодовой базы.Надеюсь, я извлек соответствующие части без недостающей информации.Представьте себе фрагмент / действие, отображающее ваш почтовый ящик, который содержит много чатов.

Код примерно такой:

fun initData() {
        listChats = ArrayList()
        listChats.add(....))

        chatAdapter!!.updateListChat(listChats)

        getDiscussionList()
}

getDiscussionList(){
    pbChat.visibility = View.VISIBLE
    lvChat.visibility = View.GONE

    listChats.clear();

    // do HTTP GET to populate listChats
    // blah blah blah

    pbChat.visibility = View.GONE
    lvChas.visibility = View.VISIBLE
}

За исключением отображения / скрытия ProgressBar и ListView, большая часть работыв getDiscussionList () анализирует JSON из HTTP GET и правильно заполняет listChat.Это отлично работает.Теперь не хватает функции автообновления.

Я добавил небольшую модификацию, теперь код выглядит следующим образом:

fun initData() {
        listChats = ArrayList()
        listChats.add(....))

        chatAdapter!!.updateListChat(listChats)

        getDiscussionList()

        activity.runOnUiThread {

            Timer().schedule(5000){
                getDiscussionList()
            }
        }
 }

Я запускаю этот код и в итоге получаю «Только исходный поток»который создал иерархию представлений, может касаться ее представлений.Как правильно выполнять getDiscussionList () каждые X секунд, тогда?

1 Ответ

0 голосов
/ 22 февраля 2019

Timer.schedule создает не-пользовательский поток для запуска кода, поэтому вы фактически запускаете getDiscussionList () в не-пользовательском потоке (что говорит ошибка);

ваш код должен выглядетьэто:

getDiscussionList(){
    //do some stuff permitted in ui and the timer thread, cause apparently both ui and non ui threads run this;
    activity.runOnUiThread {//or call some handler
         //do stuff permitted in the ui thread; e.g. accessing views
    }
}

fun initData() {
    //some code
    Timer().schedule(5000){
            getDiscussionList()
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...