1

Text を textView に設定したい場合、アプリケーション フォースが終了し、次のエラーが表示されます。

android.view.ViewRootImpl$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

これは私のコードの一部です:

Thread ThreadRecording = new Thread(new Runnable() {
    public void run() {
        while(recorder)
        {
            if (body_num = 10)
            {
                TextView loog = (TextView)findViewById(R.id.textView1);
                loog.setText("Total : 10, Thank you");
            }
        }
    }
});
ThreadRecording.start();

ボタンがあります。ユーザーがクリックすると、設定する関数が呼び出されbody_num = body_num + 1、スレッドは body_num == 10 かどうかをチェックします

4

3 に答える 3

3

ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます

UI(メイン)スレッドだけで、ビューを操作できますか。Hanlder を使用してビューを更新できます。

Handler には主に 2 つの用途があります。

  1. 将来のある時点で実行されるようにメッセージとランナブルをスケジュールするため。と
  2. 自分のスレッドとは異なるスレッドで実行されるアクションをキューに入れること。アプリケーションのプロセスが作成されると、そのメイン スレッドは、最上位のアプリケーション オブジェクト (アクティビティ、ブロードキャスト レシーバーなど) とそれらが作成するウィンドウを管理するメッセージ キューの実行専用になります。独自のスレッドを作成し、ハンドラーを介してメイン アプリケーション スレッドとやり取りすることができます。これは、前と同じ post または sendMessage メソッドを呼び出すことによって行われますが、新しいスレッドからです。指定された Runnable または Message は、Handler のメッセージ キューにスケジュールされ、適切なタイミングで処理されます。"
    -- from "developer.android.com"

例:

背景スレッド:

new Thread() {

public void run() {
    while(recorder)
        {
            if (body_num = 10)
            {                
                messageHandler.sendEmptyMessage(0);
            }
        }
   }

}.start();

メインスレッドに配置されるハンドラー:

private Handler messageHandler = new Handler() {

public void handleMessage(Message msg) {
             //update your view here
   }
};
于 2012-12-27T01:01:22.163 に答える
1

UI スレッドでのみビューを変更できます。次のような Handler を使用する必要があります。

Handler h = new Handler(context.getMainLooper()) {
    public void handleMessage(Message msg) {
        TextView loog = (TextView)findViewById(R.id.textView1);
        loog.setText(msg.obj);
    }
};

Thread ThreadRecording = new Thread(new Runnable() {
    public void run() {
        while(recorder)
        {
            if (body_num = 10)
            {
                Message message = new Message();
                message.obj = "Total : 10, Thank you";
                handler.sendMessage(message);
            }
        }
    }
});
ThreadRecording.start();
于 2012-12-27T00:57:34.293 に答える