2011-11-20 65 views
0

我正在使用教程here開發一個服務(現在)只是運行一個TimerTask來每秒鐘完成System.out.println("tick")。我的代碼與網站上的代碼完全一樣,除了一些名稱更改外。如果我不嘗試從服務傳遞字符串到活動,一切正常(服務運行,輸出「打勾」)。CalledFromWrongThreadException使用服務IPC連接

我正在努力完成的工作是在主Activity中獲取一個TextView,使用從服務接收的字符串進行更新。我有一個append(String)方法工作正常,將用新文本更新TextView。所以在我服務的TimerTask我添加listener.handleMessage("tick")和我的活動實現監聽功能:

public void handleMessage(String msg) throws RemoteException { 
    append(msg); 
} 

當我運行應用程序,System.out顯示「嘀」,然後用CalledFromWrongThreadException堆棧跟蹤,指着append()方法作爲問題的根源。

我知道這個例外有幾個問題,但其中大多數涉及ThreadHandler問題;我找不到有關服務的任何信息。任何人都知道這是可能的嗎?

解決方案

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

回答

0

更新到UI都在UI線程上發生,而不是後臺線程(如定時器)。要更新ui,請聲明類型爲Handler的成員變量,並調用post方法,傳遞一個可更新文本視圖的新可運行實例。這是一個體面的tutorial

+0

那麼,我猜其他問題_did_必須與我的。希望別人會發現這有用,雖然:第 – Snailer