0

ここのチュートリアルを使用して、 (現在) TimerTaskto 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()

この例外についていくつか質問があることは承知していますが、それらのほとんどは懸念事項ThreadHandler問題です。サービスについては何も見つかりませんでした。これが可能かどうか知っている人はいますか?

解決

実行可能な拡張:

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

1 に答える 1

0

UI の更新は、(タイマーのような) バックグラウンド スレッドではなく、UI スレッドで発生する必要があります。UI を更新するには、タイプのメンバー変数を宣言しHandler、post メソッドを呼び出して、テキスト ビューを更新できる新しい実行可能なインスタンスを渡します。これはまともなチュートリアルです

于 2011-11-20T23:57:54.237 に答える