You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调试Garmin自定义表盘时VS Code加载停滞求助

Garmin自定义表盘调试无限加载问题

问题描述

开发Garmin设备自定义表盘,使用VS Code调试Hello World程序时,页面陷入无限加载。预期程序正常运行显示表盘预览,或生成可视化.png文件。

调试控制台输出

*  Executing task: monkeyc: Building For Device 

java -Xms1g -Dfile.encoding=UTF-8 -Dapple.awt.UIElement=true -jar c:\Users\Max\AppData\Roaming\Garmin\ConnectIQ\Sdks\connectiq-sdk-win-7.3.1-2024-09-23-df7b5816a\bin\monkeybrains.jar -o bin\Hackerswatchface.prg -f c:\Users\Max\OneDrive\桌面\Garmin\WatchFaces\Hacker'swatchface\monkey.jungle -y undefined -d epix2pro47mm_sim -w

代码文件

layout.xml

<layout id="WatchFace">
    <label id="TimeLabel" x="center" y="center" font="Graphics.FONT_LARGE" justification="Graphics.TEXT_JUSTIFY_CENTER" color="0x20C20E" />
        <label id="HelloWorldLabel" x="center" y="20%" font="Graphics.FONT_LARGE" justification="Graphics.TEXT_JUSTIFY_CENTER" color="Graphics.COLOR_WHITE" />
</layout>

Hello_world_programView.mc

import Toybox.Graphics;
import Toybox.Lang;
import Toybox.System;
import Toybox.WatchUi;

class Hacker_swatchfaceView extends WatchUi.WatchFace {

    function initialize() {
        WatchFace.initialize();
    }

    // 加载资源
    function onLayout(dc as Dc) as Void {
        setLayout(Rez.Layouts.WatchFace(dc));
    }

    // 视图切换到前台时调用,恢复状态、加载资源
    function onShow() as Void {
    }

    // 更新视图
    function onUpdate(dc as Dc) as Void {
        // 获取并显示当前时间
        var clockTime = System.getClockTime();
        var timeString = Lang.format("$1$:$2$", [clockTime.hour, clockTime.min.format("%02d")]);
        var view = View.findDrawableById("TimeLabel") as Text;
        var HelloWorldText = View.findDrawableById("HelloWorldLabel") as Text;
        HelloWorldText.setText("Hello World");
        view.setText(timeString);

        // 调用父类onUpdate重绘布局
        View.onUpdate(dc);
    }

    // 视图从屏幕移除时调用,保存状态、释放资源
    function onHide() as Void {
    }

    // 用户点亮屏幕时调用,可启动计时器或动画
    function onExitSleep() as Void {
    }

    // 用户息屏时调用,终止计时器、准备低速更新
    function onEnterSleep() as Void {
    }

}

注:未修改其他内容


解决步骤

1. 重启模拟器

把Garmin模拟器彻底关掉(任务管理器杀掉相关进程),再重新运行VS Code的调试任务。模拟器进程卡死是常见的加载停滞原因,重启基本能解决一半问题。

2. 修复代码中的错误

  • 安全转换控件类型:findDrawableById返回的是通用Drawable类型,直接强转为Text容易触发异常,改成如下判断逻辑:
    var timeLabel = View.findDrawableById("TimeLabel");
    if (timeLabel is Text) {
        timeLabel.setText(timeString);
    }
    var helloLabel = View.findDrawableById("HelloWorldLabel");
    if (helloLabel is Text) {
        helloLabel.setText("Hello World");
    }
    
  • 修正父类方法调用:你的类继承自WatchFace,而非直接继承View,所以onUpdate里要调用WatchFace.onUpdate(dc),替换原来的View.onUpdate(dc),才能正确触发父类重绘逻辑。

3. 清理路径特殊字符

项目文件夹Hacker'swatchface包含单引号,可能导致编译工具解析出错,直接重命名为HackersWatchface(去掉单引号和空格),并同步更新monkey.jungle文件中的路径配置。

4. 直接生成预览图验证代码

如果模拟器还是卡死,用命令行直接生成预览图跳过模拟器验证:

java -Xms1g -Dfile.encoding=UTF-8 -jar c:\Users\Max\AppData\Roaming\Garmin\ConnectIQ\Sdks\connectiq-sdk-win-7.3.1-2024-09-23-df7b5816a\bin\monkeybrains.jar -o bin\Hackerswatchface.prg -f c:\Users\Max\OneDrive\桌面\Garmin\WatchFaces\HackersWatchface\monkey.jungle -y undefined -d epix2pro47mm_sim -s preview.png

添加-s preview.png参数后,会在项目目录生成预览图,能生成则说明代码逻辑正常,问题出在模拟器端。

内容的提问来源于stack exchange,提问作者Kam Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:09:54