从非UI线程

时间:2016-02-05 21:15:53

标签: java android multithreading ui-thread

我最近编写了一个“战舰”计划作为学校项目,现在决定制作一个便携式移动版程序。到现在为止,我已经差不多完成了,我剩下的唯一问题是我想要一个checkBox(显然在UI线程上),如果玩家在任何特定时刻转动,就会不断显示。在桌面版本中,我曾经在一个单独的线程中执行此操作,因此我不会阻止主线程上的内容。代码如下:

public void run() {
        while (true) {
            if (ClientCurrentPlayer.currentPlayer == BattleshipMain.myPlayerNumber) {
                BattleshipMain.yourTurn.setChecked(true);
            } else if (ClientCurrentPlayer.currentPlayer != BattleshipMain.myPlayerNumber) {
                BattleshipMain.yourTurn.setChecked(false);
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

但是,这会返回一个Exception,声明我无法从创建视图的其他线程更新视图。经过一些研究,似乎我可以用runOnUiThread来解决这个问题。我真的不知道我应该如何做到这一点,但是 - 如果我在UI线程上运行此代码,它会阻止所有输入,对吧?我不能在单独的线程上运行代码并在UI线程中的方法中执行setChecked部分,因为它在错误的线程上运行方法,或者我不能调用该方法runOnUiThread不能在静态上下文中使用。我不明白,请帮助我._。 但是,提前谢谢! :)

1 个答案:

答案 0 :(得分:1)

不要像这样进行轮询检查,而应考虑使用事件驱动机制。您的线程可以简单地等待事件进入.UI线程已经使用Looper执行此操作,并在后台绑定它,您可以通过在主线程上创建Handler来利用它,将您自己的Handler.Callback附加到Handler并向其发送消息。或者,您可以向Runnable发送Handler个实例。

这样的轮询线看起来非常吸引人,但是你遇到的问题就像你所看到的那样,它们会导致电池性能不佳。