0

我正在使用此处的教程来开发一个服务,该服务(现在)每秒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()作为问题根源的方法。

我知道有一些关于这个例外的问题,但其中大部分是关注ThreadHandler问题;我找不到有关服务的任何信息。有谁知道这是否可能?

解决方案

扩展可运行:

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));
 }
4

1 回答 1

0

ui 的更新必须发生在 ui 线程上,而不是后台线程(如计时器)。要更新 ui,请声明一个类型的成员变量Handler并调用 post 方法,传递一个新的可运行实例,该实例可以更新您的文本视图。这是一个不错的教程

于 2011-11-20T23:57:54.237 回答