Roku频道开发:Timer未触发onPoll方法问题求助
Roku Timer轮询不触发fire事件的排查与解决方法
以下是针对Timer无法触发onPoll方法的具体排查步骤和解决方案:
1. 确保Timer已加入节点树并处于活跃上下文
Roku的Timer组件属于Scene Graph节点,必须被添加到**显示树(Display Tree)**中才能正常触发事件:
- 动态创建Timer时,需调用
m.top.appendChild(timer)将其挂载到当前组件的节点树中 - XML中定义的Timer,必须嵌套在已加载到当前场景的容器组件内(如Scene、Group等)
示例(动态创建):
sub init() ' 将Timer保存到组件的m变量,避免函数执行后被回收 m.pollTimer = CreateObject("roSGNode", "Timer") m.top.appendChild(m.pollTimer) ' 挂载到节点树 end sub
2. 检查Timer核心属性配置
- interval:必须设置为正整数(单位毫秒),不能为0或负数,例如
interval=3000表示3秒轮询一次 - repeat:若需要循环轮询需设为
true,默认值为false(仅触发一次) - enabled:必须显式设置为
true,或调用timer.Start()启动,二者缺一不可
示例:
sub startPolling() m.pollTimer.interval = 3000 m.pollTimer.repeat = true m.pollTimer.enabled = true m.pollTimer.Start() end sub
3. 避免Timer对象被垃圾回收
如果Timer是函数内的局部变量,函数执行完毕后会被系统回收,导致无法触发后续事件:
- 必须将Timer保存到组件的
m变量(如m.pollTimer)或全局节点中,保证其生命周期覆盖轮询过程
4. 验证事件绑定正确性
- 动态创建Timer时,使用
observeField("fire", "onPoll")绑定事件,注意事件字段名是fire而非onFire - XML中定义Timer时,使用
onFire="onPoll"绑定方法
示例(XML方式):
<component name="DeviceScene" extends="Scene"> <children> <Timer id="pollTimer" interval="3000" repeat="true" enabled="false" onFire="onPoll" /> </children> </component>
5. 确认onPoll方法的可访问性
onPoll必须是组件脚本中的全局函数,不能定义在其他局部函数内部- 检查方法名拼写是否正确,避免大小写或字符错误
示例:
' 必须定义在组件脚本的全局作用域 sub onPoll() print "触发设备状态轮询" ' 执行设备激活状态验证逻辑 end sub
6. 查看开发者控制台排查错误
通过Roku Developer Tools的控制台输出,检查是否存在以下问题:
- Timer节点未找到的错误(如
findNode返回无效值) onPoll方法不存在的报错- Timer属性配置非法的提示
内容的提问来源于stack exchange,提问作者Suleyman
相关产品推荐
相关产品推荐

