-1

(Eclipse での Android のプログラミング) ボタンのテキストを変更する際に遅延を設定しようとしています。遅延が発生し、テキストを変更する必要がある場合にのみ、エラーが発生します。while ループのない単純化されたコードを次に示します。

final Button button_target = (Button) findViewById(R.id.button_target);        
    Thread textChange = new Thread(new Runnable() { 
        public void run(){
            button_target.setText("fog");
            try{
                Thread.sleep(3000);
            }catch(InterruptedException e){}                
        }
    });
    textChange.start();

次に、スリープにボタンのテキストの変更が必要なコードを示します。これにより、エラーが発生して終了 (強制) されます。

 final Button button_target = (Button) findViewById(R.id.button_target);        
    Thread textChange = new Thread(new Runnable() { 
        public void run(){
            button_target.setText("cat");
            try{
                Thread.sleep(3000);
            }catch(InterruptedException e){}                
            button_target.setText("dog");
        }
    });
    textChange.start();

エラーを引き起こすために何をしていますか?テキスト変更操作を実行できるように、スレッドにスリープまたは遅延を呼び出すことができるようにする必要がある別の方法はありますか?

(実際のコードには while ループがありますが、この形式でエラーが強調表示されると思います)

4

1 に答える 1

2

setText() のようなスレッドで UI を変更することはできません。UIThread で行う必要があります。詳細については、AsyncTask を参照してください。

http://developer.android.com/reference/android/os/AsyncTask.html

さらに情報を追加

次のように、使用する Android のバージョンに応じて、AsyncTask で THREAD_POOL_EXECUTOR を使用できます。

AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... voids) {

        try{
            Thread.sleep(3000);
            }catch(InterruptedException e){} 
        }
    }

    @Override
    protected void onPostExecute(Void result) {
        button_target.setText("dog");
    }

};

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    task.execute();
}
于 2012-10-15T15:37:54.583 に答える