【问题标题】:A simple clock for an android game? [duplicate]一个简单的安卓游戏时钟? [复制]
【发布时间】:2018-08-28 16:24:08
【问题描述】:

我正在尝试使用 Android sdk 实现一个简单的游戏。该游戏使用自定义视图作为游戏区域。我尝试使用此代码 sn-p 为游戏添加一个简单的时钟。基本上它会在自定义游戏视图上以固定频率启动一个调用invalidate 的线程:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    class GameClock extends Thread {

        CanvasView cv;

        public GameClock(Activity ctx) {
            cv = ctx.findViewById(R.id.MainGame);
        }

        public void run() {
            while (! cv.initialized) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignored) {
                }
            }

            // TODO: fix this
            while (true) {
                cv.invalidate();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignored) {
                }
            }
        }
    }

    new GameClock(this).run();

}

但是当我启动应用程序时,它只是挂起并且不显示任何内容。为什么会这样?如何修复它以按预期工作?

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    通过执行new GameClock(this).run();,你只是在当前线程中执行run方法,你需要调用new GameClock(this).start();来启动一个新线程。

    【讨论】:

    • 感谢您的修复。我纠正了这一点,现在应用程序因以下错误而崩溃:08-28 21:58:44.518 3675-3695/com.example.saga.rotatingcircle E/AndroidRuntime: FATAL EXCEPTION: Thread-33681 Process: com.example.saga.rotatingcircle, PID: 3675 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 难道不能在另一个线程的视图上调用invalidate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多