有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从非UI线程更新“复选框”

我最近编写了一个“战舰”项目作为学校项目,现在决定制作一个便携式移动版本的项目。到现在为止,我也差不多完成了,我唯一剩下的问题是,我想要一个复选框(显然在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();
            }
        }
    }

但是,这将返回一个异常,说明我无法从创建视图的线程之外的其他线程更新视图。经过一点研究,我似乎可以用runOnUiThread解决这个问题。我真的不知道该怎么做,但是-如果我在UI线程上运行此代码,它会阻止所有输入,对吗?我不能在单独的线程上运行代码,也不能在UI线程的方法中执行setChecked部分,因为它要么在错误的线程上运行该方法,要么我不能调用该方法,因为runOnUiThread不能在静态上下文中使用。我不明白,请帮帮我。 不过,先谢谢你!:)


共 (1) 个答案

  1. # 1 楼答案

    <>而不是像这样做轮询检查,考虑使用事件驱动机制。你的线程可以简单地等待事件的到来。UI线程已经在使用一个Looper来实现这一点,这个Looper在后台绑定到它,您可以通过在主线程上创建一个Handler来利用它,将您自己的Handler.Callback附加到该Handler并发送消息。或者,您可以将Runnable实例发送到Handler

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