4

スレッド内からsetTextを実行したい。

これは私のスレッドのコードです:

private class GenerateThread implements Runnable {
    public void run(){
            // generate the first music
            music = generate(prevmusic, prevmusic.length);
            prevmusic = music;

            // write the midi
            writeMidi(music, song);
            textOut.setText("Initialising...");
            });
    }
}

私のメインコードでは、

Thread t = new Thread(new GenerateThread());
    t.start();

スレッド内からsetTextを使用することはできません。インターネット上のいくつかの投稿に続いて、私はハンドラーを使用しようとしましたが、それは私にエラーを与えました、私はこのようにRunnableを二重に定義していると思います。

ハンドラーハンドラー(メインの前)

private class GenerateThread implements Runnable {
    public void run(){
            handler.post(new Runnable() {
            // generate the first music
            music = generate(prevmusic, prevmusic.length);
            prevmusic = music;

            // write the midi
            writeMidi(music, song);
            textOut.setText("Initialising...");
            });
    }
}

スレッド内からテキストを設定するにはどうすればよいですか?ありがとう!

4

2 に答える 2

4

それに加えて、外側のアクティビティ()への醜い見た目の参照を必要としないので、ここで私が好むものrunOnUiThreadもあります。View#post(Runnable)MyActivity.this.runOnUiThread()

private class GenerateRunnable implements Runnable {
    public void run() {
        // this code is executed in a background thread.
        // generate the first music
        music = generate(prevmusic, prevmusic.length);
        prevmusic = music;

        // write the midi
        writeMidi(music, song);
        textOut.post(new Runnable() {
            public void run() {
                // this code is executed on the UI thread.
                textOut.setText("Initialising...");
            }
        });
    }
}

@Override
protected void onResume() {
    super.onResume();
    new Thread(new GenerateRunnable()).start();
}

Runnableまた、とを混同しないでくださいThread。Aは、メソッドRunnableを持つ単なる通常のクラスです。run()これは、新しいで実行される可能性があり、多くの場合実行されThreadます。あなたが望むなら、あなたはそのようGenerateThreadに本物を作ることもできますThread

private class GenerateThread extends Thread {
    @Override
    public void run() {
        // code here.
    }
}
// start somewhere
new GenerateThread().start();

また、クラシックを使用するだけでなく、長時間実行するタスクのために作成されており、後でUIを更新する必要があるため、使用を検討Threadすることもできます。AsyncTask

于 2012-09-18T14:30:47.383 に答える
3

UIを更新できるのはUIスレッドからのみです。 runOnUiThreadを使用すると、次に実行するときにUIスレッドでアクションを実行できます。あなたは次のようなことをすることができます:

runOnUiThread(new Runnable() {
  public void run() {
      textOut.setText("Initialising...");
  }
});

編集:

private class GenerateThread implements Runnable {
   public void run(){
      // generate the first music
      music = generate(prevmusic, prevmusic.length);
      prevmusic = music;

      // write the midi
      writeMidi(music, song);

      // Update the UI
      MyActivity.this.runOnUiThread(new Runnable() {
        public void run() {
          textOut.setText("Initialising...");
        }
      });
   }
}
于 2012-09-18T14:08:56.547 に答える