我想从一个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...");
});
}
}
我怎样才能在线程中设置文本?谢谢!
答案 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();
}
另请不要混淆Runnable
和Thread
。 Runnable
只是一个使用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...");
}
});
}
}