我正在使用教程here开发一个服务(现在)只需每秒运行TimerTask
来执行System.out.println("tick")
。除了一些名称更改之外,我的代码与网站上的代码完全相同。如果我不尝试将字符串从服务传递给活动,那么一切正常(服务运行,输出“滴答”)。
我想要完成的任务是在主Activity中使用从服务接收的字符串更新TextView。我有一个append(String)
方法正常工作,将使用新文本更新TextView。所以在我的服务TimerTask
中我添加了listener.handleMessage("tick")
,我的Activity实现了监听器功能:
public void handleMessage(String msg) throws RemoteException {
append(msg);
}
当我运行应用程序时,System.out
显示“tick”,然后是CalledFromWrongThreadException
的堆栈跟踪,指向append()
方法作为问题的来源。
我知道有关此异常的一些问题,但大多数问题都涉及Thread
和Handler
问题;我找不到任何关于服务的信息。有人知道这是否可行?
扩展Runnable:
class MyRunnable implements Runnable {
private String msg;
public MyRunnable(String msg) {
this.msg = msg;
}
public void run() {
appendNewline(msg);
}
}
并通过调用global Handler替换回调:
public void handleMessage(String msg) throws RemoteException {
handler.post(new MyRunnable(msg));
}
答案 0 :(得分:0)
ui的更新必须发生在ui线程而不是后台线程(如计时器的线程)。要更新ui,请声明类型为Handler
的成员变量并调用post方法,并传递可以更新文本视图的新runnable实例。这是一个不错的tutorial