Я использую учебное пособие здесь для разработки Сервиса, который (прямо сейчас) просто запускает 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));
}