调试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
相关产品推荐
相关产品推荐

