Это приложение многопоточное, не так ли? В этом случае только один поток может выполнять операции над пользовательским интерфейсом - поток пользовательского интерфейса. Если вы не создаете новые темы вручную, вам не нужно беспокоиться об этом. Как только вы начинаете новый поток самостоятельно и хотите, чтобы он делал что-то связанное с пользовательским интерфейсом (например, обновление текста текстового поля serverStatus), вы должны сделать это в потоке пользовательского интерфейса. Несоблюдение этого правила приведет к исключению.
Обработчики используются для передачи сообщений между потоками. В этом случае поток пользовательского интерфейса имеет обработчик, который был отправлен в качестве параметра при создании серверного потока. Каждый раз, когда ему нужно обновить пользовательский интерфейс, он отправляет сообщение в поток пользовательского интерфейса, который периодически проверяет наличие новых сообщений и выполняет присоединенные к ним Runnables.
Вот еще одна ссылка (с примером), которая может помочь вам понять ее немного лучше:
http://developer.android.com/guide/appendix/faq/commontasks.html#threading