Roku 计时器未触发:观察方法未触发

问题描述 投票:0回答:1

我正在创建一个 Roku 频道。我需要启动计时器并检查设备是否正在验证。这可能是一个复杂的逻辑,但您可以在下面看到我的代码。成功添加设备,并触发onAddDeviceResult方法。然后 startPolling 方法正在运行,但它不会触发 onPoll 方法,因此我无法验证设备。我该如何解决这个问题?谢谢。

sub init()
    m.deviceActivatedLabel = m.top.findNode("deviceActivatedLabel")
    m.qrPoster = m.top.findNode("qrPoster")

    m.deviceSetting = new DeviceSettings()
    m.deviceSetting.initialize()

    m.deviceUUID = m.deviceSetting.getDeviceUUID()
    m.deviceCode = m.deviceSetting.getDeviceCode()

    qrUrl = "url"
    m.qrPoster.uri = qrUrl

    if (m.deviceSetting.readRegistry(m.deviceSetting.deviceActivatedKey) = "true")
        m.deviceActivatedLabel.visible = true
        print "Device already activated!"
        navigateToNextScreen()
    else
        m.deviceActivatedLabel.visible = false
        print "Starting activation process..."
        addDeviceAndStartPolling()
    end if
end sub

sub addDeviceAndStartPolling()
    m.apiTask2 = createObject("roSGNode", "ApiTask2")

    m.apiTask2.SetField("deviceUUID", m.deviceUUID)
    m.apiTask2.SetField("deviceCode", m.deviceCode)

    m.apiTask2.ObserveField("result", "onAddDeviceResult")
    print "Observer registered for result field."

    print "Adding device with UUID: " + m.deviceUUID + " and Code: " + m.deviceCode

    m.apiTask2.control = "RUN"
end sub

sub onAddDeviceResult(event as Object)
    print "Observed change in result field."
    response = event.getData()
    print "Add Device Response: "; response

    if (response = invalid or response.id = invalid)
        print "Failed to add device."
        return
    end if

    m.deviceSetting.setDeviceId(response.id)
    print "Device added successfully. Starting activation loop..."

    startPolling()
end sub

sub startPolling()
    m.attempts = 0
    m.maxAttempts = 10

    m.pollTimer = createObject("roSGNode", "Timer")
    m.pollTimer.duration = 5000
    m.pollTimer.repeat = true
    
    if (m.pollTimer = invalid)
        print "Failed to create the Timer node."
        return
    end if

    m.pollTimer.observeField("fire", "onPoll")
    print "Observer registered for Timer fire event."
    m.top.appendChild(m.pollTimer)

    m.pollTimer.control = "start"
    print "Polling started with a 5-second interval."
end sub

sub onPoll()
    print "Timer fired. Polling now..."

    if (m.attempts >= m.maxAttempts)
        print "Max attempts reached. Stopping polling."
        m.pollTimer.control = "stop"
        return
    end if

    m.attempts = m.attempts + 1
    print "Polling attempt: " + m.attempts.toStr()

    m.apiTask = createObject("roSGNode", "ApiTask")

    m.apiTask.SetField("deviceUUID", m.deviceUUID)
    m.apiTask.SetField("deviceCode", m.deviceCode)

    m.apiTask.ObserveField("result", "onVerifyDeviceResult")
    m.apiTask.control = "RUN"
end sub

sub onVerifyDeviceResult(event as Object)
    response = event.getData()
    print "Verify Device Response: "; response

    if (response <> invalid and response.activated = true)
        print "Device activated successfully!"
        m.deviceSetting.writeRegistry(m.deviceSetting.deviceActivatedKey, "true")
        m.deviceActivatedLabel.visible = true

        m.pollTimer.control = "stop"
        navigateToNextScreen()
    else
        print "Device not activated yet. Retrying..."
    end if
end sub

sub navigateToNextScreen() as void
    print "Navigating to the next screen..."
end sub

我尝试将计时器添加到 xml 文件中。但还是没成功。

xml roku brightscript scenegraph
1个回答
0
投票

代码应该可以正常工作。问题在于计时器持续时间。持续时间 5000 实际上是秒而不是毫秒。因此,您的计时器将在 5000 秒后(即 1 小时 23 分 20 秒后)被触发。如果您想在 5 秒后触发它,请将持续时间仅设置为 5。

© www.soinside.com 2019 - 2024. All rights reserved.