CalledFromWrongThreadException с использованием соединения IPC службы - PullRequest
0 голосов
/ 21 ноября 2011

Я использую учебное пособие здесь для разработки Сервиса, который (прямо сейчас) просто запускает TimerTask для выполнения System.out.println("tick") каждую секунду.Мой код точно такой же, как код на сайте, за исключением некоторых изменений имени.Все работает (служба запускается, выводит «галочку»), если я не пытаюсь передать строку из службы в действие.

Что я пытаюсь выполнить , так этополучить TextView в основной Деятельности, которая будет обновлена ​​Строкой, полученной от Сервиса.У меня есть метод append(String), работающий нормально, который обновит TextView с новым текстом.Итак, в моей службе TimerTask я добавил listener.handleMessage("tick"), и моя активность реализует функциональность слушателя:

 public void handleMessage(String msg) throws RemoteException {
    append(msg);
 }

Когда я запускаю приложение, System.out показывает «галочку», а затем трассировку стека сCalledFromWrongThreadException, указывающий на метод append() как источник проблемы.

Я знаю, что есть несколько вопросов об этом Исключении, но большинство из них касаются вопросов Thread и Handler;Я не мог найти что-нибудь о Сервисах.Кто-нибудь знает, возможно ли это?

Решение

Расширение Runnable:

class MyRunnable implements Runnable {
    private String msg;
    public MyRunnable(String msg) {
        this.msg = msg;
    }

    public void run() {
        appendNewline(msg);
    }   
}

и замена обратного вызова вызовом глобального обработчика:

 public void handleMessage(String msg) throws RemoteException {
    handler.post(new MyRunnable(msg));
 }

1 Ответ

0 голосов
/ 21 ноября 2011

Обновления пользовательского интерфейса должны происходить в потоке пользовательского интерфейса, а не в фоновом потоке (как в таймере).Чтобы обновить пользовательский интерфейс, объявите переменную-член типа Handler и вызовите метод post, передав новый запускаемый экземпляр, который может обновить ваше текстовое представление.Это достойный учебник

...