4

我想从一个线程中设置文本。

这是我的线程代码:

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();

它不允许我从线程内设置文本。在互联网上的一些帖子之后,我尝试使用处理程序,但这给了我错误,我认为我以这种方式双重定义 Runnable。

处理程序处理程序(在 main 之前)

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...");
            });
    }
}

如何从 Thread 中设置文本?谢谢!

4

2 回答 2

4

除此之外runOnUiThreadView#post(Runnable)我更喜欢这里,因为您不需要对外部 Activity ( 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();
}

也不要混淆RunnableThread。ARunnable只是一个带有run()方法的普通类。它可以并且经常在新的Thread. 如果你愿意,你也可以像这样制作GenerateThread一个真实的Thread

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

除了使用经典之外,Thread您还可以考虑使用AsyncTask,因为它专门用于执行长时间运行并且需要在之后或有进展时更新 UI 的任务。

于 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 回答