Как редактировать EditText и TextView в пользовательском интерфейсе одновременно - PullRequest
3 голосов
/ 22 сентября 2011

Я реализую простое приложение для чата, которое имеет TextView для текстовых сообщений и EditText для ввода.Я обновляю свой TextView следующим способом:

    private void addChatContent(String authorName, String content){
    final String newLine = authorName+" : "+content+"\n";
    chat_content.append(newLine);
    scroll.post(new Runnable(){
        @Override
        public void run() {
            scroll.smoothScrollTo(0, chat_content.getBottom()+5000);
        }
    });
}

Проблема, с которой я сталкиваюсь: при появлении новых входящих сообщений поток пользовательского интерфейса будет занят обновлением TextView.Это делает мой EditText запаздывающим, я с трудом могу отредактировать свой ввод.Я не могу обновить TextView другим потоком, верно?Так что я должен сделать, чтобы преодолеть это ограничение?Может ли кто-нибудь дать мне немного света?Заранее спасибо.

1 Ответ

2 голосов
/ 22 сентября 2011

В конечном итоге, к сожалению, существует только один поток, посвященный пользовательскому интерфейсу.Если вы обновляете TextView, вы не сможете одновременно работать с EditText без задержек.Вы уже знаете это, но я боюсь, что некоторые люди, отвечающие на этот вопрос, могут не знать, поэтому вот ссылка :

Система не создает отдельный поток для каждого экземпляра компонента,Все компоненты, которые выполняются в одном и том же процессе, создаются в потоке пользовательского интерфейса, и системные вызовы каждого компонента отправляются из этого потока.Следовательно, методы, которые отвечают на системные обратные вызовы (например, onKeyDown () для сообщения о пользовательских действиях или метод обратного вызова жизненного цикла), всегда выполняются в потоке пользовательского интерфейса процесса

...

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

...

Кроме того, инструментарий Andoid UI не является поточно-ориентированным.Таким образом, вы не должны манипулировать своим пользовательским интерфейсом из рабочего потока - вы должны выполнять все манипуляции со своим пользовательским интерфейсом из потока пользовательского интерфейса.Таким образом, для однопоточной модели Android существует два правила:

Не блокировать поток пользовательского интерфейса. Не получать доступ к инструментарию пользовательского интерфейса Android извне потока пользовательского интерфейса.

Следовательно, ответвполне понятно: не делай этого.Почему Textview должен быть абсолютно обновлён на 100%, так как пользователь обновляет поле EditText?Почему вы прокручиваете весь путь до самого дна;может быть, вам удастся удалить большую часть содержимого TextView и, когда пользователь прокручивает, динамически повторно добавлять в него содержимое?

IMO, вам следует сосредоточиться на сокращении объема работы, которую необходимо выполнитьTextView.

...