从线程更新TextView中的文本
我已将TextView
添加到RelativeLayout
,我已将其添加到SurfaceView
。我可以让TextView
在我的SurfaceView
上显示文字。从线程更新TextView中的文本
rl = new RelativeLayout(this);
tv = new TextView(this);
tv.setText(Integer.toString(GameScreen.score));
tv.setTextSize(50);
tv.setPadding(390, 50, 0, 0);
tv.setTextColor(Color.BLACK);
rl.addView(renderView);
rl.addView(tv);
setContentView(rl);
然后在我的GameScreen类的更新方法,我把:
game.getTextView().setText(Integer.toString(score));
,它给我的错误:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
我能做些什么来解决这个问题?
使用是对UiThread
game.getTextView().post(new Runnable() {
@Override
public void run() {
game.getTextView().setText(Integer.toString(score));
}
});
希望这有助于更新Widget
推荐的方法如下。
非常棒谢谢你!这工作!它帮助我了解@ankit的解决方案! – Noitidart
在UI线程中运行您的代码。您不能从工作线程执行UI操作。
your_context.runOnUiThread(new Runnable() {
public void run(){
game.getTextView().setText(Integer.toString(score));
}
});
感谢您的快速回复,这个解决方案是正确的,但直到我看到下面的@Must解决方案对我来说没有意义。但绝对投票,非常感谢你! – Noitidart
使用这个peice代码..确保它会帮助你!
private void runThread() {
new Thread() {
public void run() {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
game.getTextView().setText(Integer.toString(score));
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
让我知道它是否工作! :)
谢谢Vivek! @Must下面的解决方案工作,但这有助于我学习,我真的很感激它! – Noitidart
我很高兴这为你工作! :)干杯! –
的可能的复制[Android的 - ViewRootImpl $ CalledFromWrongThreadException(http://*.com/questions/10118301/android-viewrootimplcalledfromwrongthreadexception) – rkosegi
感谢rkosegi我读了它,但是从ANKIT解决方案做了一些感觉,但我直到@MustansarSaeed解释它不明白它 – Noitidart
可能重复的[Android的更新TextView在线程和运行](http://*.com/questions/12716850/android-update-textview-in-thread-and-runnable) – OnePunchMan