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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:30:01