Вопрос по поводу запуска Android - PullRequest
3 голосов
/ 22 декабря 2010

Я видел кусок кода онлайн. Мне интересно, почему мы должны использовать runnable для установки текста TextView? Спасибо!

    while (true) {
    // listen for incoming clients
    Socket client = serverSocket.accept();
    handler.post(new Runnable() {
        @Override
        public void run() {
            serverStatus.setText("Connected.");
        }
    });

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

Ответы [ 2 ]

7 голосов
/ 22 декабря 2010

Это приложение многопоточное, не так ли? В этом случае только один поток может выполнять операции над пользовательским интерфейсом - поток пользовательского интерфейса. Если вы не создаете новые темы вручную, вам не нужно беспокоиться об этом. Как только вы начинаете новый поток самостоятельно и хотите, чтобы он делал что-то связанное с пользовательским интерфейсом (например, обновление текста текстового поля serverStatus), вы должны сделать это в потоке пользовательского интерфейса. Несоблюдение этого правила приведет к исключению.

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

Вот еще одна ссылка (с примером), которая может помочь вам понять ее немного лучше: http://developer.android.com/guide/appendix/faq/commontasks.html#threading

1 голос
/ 22 декабря 2010

Этот фрагмент кода находится в потоке сервера.Пользовательский интерфейс (в этом случае edittext) может быть обновлен только в Uithread.Runnable возвращает вас в поток пользовательского интерфейса.Справка: http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

...