使用Service IPC连接CalledFromWrongThreadException

时间:2011-11-20 23:41:51

标签: android service thread-safety ipc aidl

我正在使用教程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()方法作为问题的来源。

我知道有关此异常的一些问题,但大多数问题都涉及ThreadHandler问题;我找不到任何关于服务的信息。有人知道这是否可行?

解决方案

扩展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));
 }

1 个答案:

答案 0 :(得分:0)

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