ここのチュートリアルを使用して、 (現在) TimerTask
to do をSystem.out.println("tick")
毎秒実行しているサービスを開発しています。私のコードは、いくつかの名前の変更を除けば、サイトのコードとまったく同じです。サービスからアクティビティに文字列を渡そうとしないと、すべてが機能します (サービスが実行され、「ティック」が出力されます)。
私が達成しようとしているのは、メイン アクティビティの TextView を、サービスから受け取った文字列で更新することです。TextView を新しいテキストで更新するappend(String)
メソッドが正常に機能しています。したがって、サービスTimerTask
に追加listener.handleMessage("tick")
し、アクティビティにリスナー機能を実装します。
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);
}
}
コールバックをグローバル Handler への呼び出しに置き換えます。
public void handleMessage(String msg) throws RemoteException {
handler.post(new MyRunnable(msg));
}