我正在使用此处的教程来开发一个服务,该服务(现在)每秒TimerTask
只运行一个。System.out.println("tick")
除了一些名称更改之外,我的代码与网站上的代码完全相同。如果我不尝试将字符串从服务传递到活动,一切正常(服务运行,输出“tick”)。
我想要完成的是让主 Activity 中的 TextView 使用从服务接收到的字符串进行更新。我有一个append(String)
工作正常的方法,它将用新文本更新 TextView。因此,在我的服务中,TimerTask
我添加了listener.handleMessage("tick")
并且我的 Activity 实现了侦听器功能:
public void handleMessage(String msg) throws RemoteException {
append(msg);
}
当我运行应用程序时,System.out
显示一个“勾号”,然后显示一个带有 的堆栈跟踪CalledFromWrongThreadException
,指向append()
作为问题根源的方法。
我知道有一些关于这个例外的问题,但其中大部分是关注Thread
和Handler
问题;我找不到有关服务的任何信息。有谁知道这是否可能?
解决方案
扩展可运行:
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));
}