我最近编写了一个“战舰”计划作为学校项目,现在决定制作一个便携式移动版程序。到现在为止,我已经差不多完成了,我剩下的唯一问题是我想要一个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
不能在静态上下文中使用。我不明白,请帮助我._。
但是,提前谢谢! :)
答案 0 :(得分:1)
不要像这样进行轮询检查,而应考虑使用事件驱动机制。您的线程可以简单地等待事件进入.UI线程已经使用Looper
执行此操作,并在后台绑定它,您可以通过在主线程上创建Handler
来利用它,将您自己的Handler.Callback
附加到Handler
并向其发送消息。或者,您可以向Runnable
发送Handler
个实例。
这样的轮询线看起来非常吸引人,但是你遇到的问题就像你所看到的那样,它们会导致电池性能不佳。