如何从Android中的单独Thread中设置文本

时间:2012-09-18 14:02:27

标签: java android multithreading

我想从一个Thread中设置文本。

这是我的线程代码:

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。

处理程序处理程序(在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...");
            });
    }
}

我怎样才能在线程中设置文本?谢谢!

2 个答案:

答案 0 :(得分:4)

除了runOnUiThread之外,还有View#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();
}

另请不要混淆RunnableThreadRunnable只是一个使用run()方法的普通类。它可以并且经常在新的Thread上执行。如果您愿意,也可以GenerateThread使Thread成为真实的private class GenerateThread extends Thread { @Override public void run() { // code here. } } // start somewhere new GenerateThread().start();

Thread

除了使用经典AsyncTask之外,您还可以考虑使用{{1}},因为这完全适用于执行长时间运行并且需要在之后更新UI或有进展的任务。

答案 1 :(得分: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...");
        }
      });
   }
}