【问题标题】:Update text in a TextView from a Thread从线程更新 TextView 中的文本
【发布时间】:2016-06-13 11:05:31
【问题描述】:

我已将 TextView 添加到已添加 SurfaceViewRelativeLayout。我可以让TextView 在我的SurfaceView 上显示文本。

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: 只有 创建视图层次结构的原始线程可以触及其视图。

我能做些什么来解决这个问题?

【问题讨论】:

标签: android


【解决方案1】:

使用以下推荐的方式在UiThread 上更新Widget

game.getTextView().post(new Runnable() {
                @Override
                public void run() {
                    game.getTextView().setText(Integer.toString(score));
                }
            });

希望这会有所帮助。

【讨论】:

  • 非常感谢!这行得通!它也帮助我理解了@ankit 的解决方案!
【解决方案2】:

在 UI 线程中运行您的代码。您不能从工作线程执行 UI 操作。

your_context.runOnUiThread(new Runnable() {
    public void run(){   
        game.getTextView().setText(Integer.toString(score));
    }
});

【讨论】:

  • 感谢您的快速回复,这个解决方案是正确的,但直到我看到下面的@Must 解决方案对我来说才有意义。但绝对赞成,非常感谢!
【解决方案3】:

使用这段代码.. 嗯,它肯定会帮助你!

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

让我知道它是否有效! :)

【讨论】:

  • 谢谢维韦克!下面@Must 的解决方案有效,但这有助于我了解我真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多