Как вызвать XML-код из Brightscript для канала Roku?

Я пытаюсь заполнить список меток, используя приведенный ниже XML Roku Channel, код сцены. Я получаю следующие ошибки:

BRIGHTSCRIPT: ERROR: roSGScreen: creating MAIN|TASK-only component failed on RENDER thread: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(101)
BRIGHTSCRIPT: ERROR: roMessagePort: Trying to construct a message port on a non-plugin thread: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(102) 

Вызов кода Brightscript:

   ' on Button press handle
Sub onItemSelected()
    showChannelSGScreen()
End Sub

sub showChannelSGScreen()
  screen = CreateObject("roSGScreen")
  m.port = CreateObject("roMessagePort")
  screen.setMessagePort(m.port)
  scene = screen.CreateScene("LabelListExample")
  screen.show()

  while(true)
    msg = wait(0, m.port)
    msgType = type(msg)

    if msgType = "roSGScreenEvent"
      if msg.isScreenClosed() then return
    end if
  end while

end sub

XML код:

<?xml version = "1.0" encoding = "utf-8" ?>

<!--********** Copyright 2016 Roku Corp.  All Rights Reserved. **********-->

<component name = "LabelListExample" extends = "Group" initialFocus = "exampleLabelList" >

  <script type = "text/brightscript" >

    <![CDATA[

    sub init()
      examplerect = m.top.boundingRect()
      centerx = (1280 - examplerect.width) / 2
      centery = (720 - examplerect.height) / 2
      m.top.translation = [ centerx, centery ]
    end sub

    ]]>

  </script>

  <children >

    <LabelList id = "exampleLabelList" >

      <ContentNode role = "content" >
        <ContentNode title = "Renderable Nodes" />
        <ContentNode title = "Z-Order/Parent-Child" />
        <ContentNode title = "Animations" />
        <ContentNode title = "Events and Observers" />
      </ContentNode>

    </LabelList>

  </children>

</component>

У меня вопрос: как правильно вызывать XML из Brightscript?

***** Полное сообщение об ошибке **:

BRIGHTSCRIPT: ERROR: roSGScreen: creating MAIN|TASK-only component failed on RENDER thread: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(101)
BRIGHTSCRIPT: ERROR: roMessagePort: Trying to construct a message port on a non-plugin thread: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(102)

BrightScript Micro Debugger.
Enter any BrightScript statement, debug commands, or HELP.

Suspending threads...
Thread selected:  1*   ...ailsScreen/DetailsScreen.brs(103)    screen.setMessagePort(m.port)

Current Function:
100:  sub showChannelSGScreen()
101:    screen = CreateObject("roSGScreen")
102:    m.port = CreateObject("roMessagePort")
103:*   screen.setMessagePort(m.port)
104:    scene = screen.CreateScene("LabelListExample")
105:    screen.show()
106:  
107:    while(true)
'Dot' Operator attempted with invalid BrightScript Component or interface reference. (runtime error &hec) in pkg:/components/screens/DetailsScreen/DetailsScreen.brs(103)
103:   screen.setMessagePort(m.port)
Backtrace:
#1  Function showchannelsgscreen() As Void
   file/line: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(103)
#0  Function onitemselected() As Void
   file/line: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(95)
Local Variables:
global           Interface:ifGlobal
m                roAssociativeArray refcnt=3 count:7
screen           Invalid
scene            <uninitialized>
msg              <uninitialized>
msgtype          <uninitialized>
Threads:
ID    Location                                Source Code
 0    pkg:/source/main.brs(20)                msg = wait(0, port)
 1*   ...ailsScreen/DetailsScreen.brs(103)    screen.setMessagePort(m.port)
  *selected

Brightscript Debugger> 
Thread detached
>>> Details >> OnkeyEvent

Thread detached

person neowinston    schedule 10.08.2017    source источник


Ответы (3)


Метод CreateScene следует вызывать только с компонентом сцены в качестве аргумента. Компонент LabelListExample в вашем случае не является сценой, поскольку он расширяет Group. Измените эту строку:

<component name = "LabelListExample" extends = "Group" initialFocus = "exampleLabelList" >

К этому:

<component name = "LabelListExample" extends = "Scene" initialFocus = "exampleLabelList" >
person Eugene Smoliy    schedule 10.08.2017
comment
Привет, Евгений, спасибо за ответ. У меня все еще та же ошибка после вашего предложения. Я обновил свой вопрос полным сообщением об ошибке. Не могли бы вы взглянуть на это? Спасибо еще раз! - person neowinston; 10.08.2017
comment
Убедитесь, что вы не запускаете функцию showChannelSGScreen в потоке рендеринга. Эта функция должна вызываться в основном потоке. - person Eugene Smoliy; 11.08.2017
comment
Дорогой Евгений, спасибо, что помогли мне. Я вызываю showChannelSGScreen в Sub onItemSelected (). Я думаю, что это основная тема, верно? - person neowinston; 11.08.2017
comment
Нет, это поток рендеринга. По сути, вам нужно будет создать roSGScreen только один раз, при запуске приложения. - person Eugene Smoliy; 11.08.2017
comment
Итак, вместо вызова screen = CreateObject (roSGScreen), как мне вызвать этот новый экран? Не могли бы вы включить код в свой ответ? Спасибо! - person neowinston; 11.08.2017
comment
Не могли бы вы указать, как вызвать его из основного потока? Большое спасибо. - person neowinston; 11.08.2017
comment
Проблема в том, что я пытаюсь заполнить список меток после запуска канала в качестве другого экрана. - person neowinston; 11.08.2017

Из вашего сообщения об ошибке

BRIGHTSCRIPT: ОШИБКА: roSGScreen: не удалось создать компонент MAIN | TASK-only в потоке RENDER: pkg: /components/screens/DetailsScreen/DetailsScreen.brs (101)

Понятно, что вы создаете экземпляр экрана в потоке Render. Есть два возможных способа навигации по экрану.

  1. Через основной класс при запуске приложения
  2. С помощью компонента Task для создания экземпляров экрана и отправки их в стек экрана.

Я бы посоветовал использовать второй вариант, в котором вы можете создавать и нажимать на экран в зависимости от ваших потребностей.

В вашем случае вы можете создать скрипт для функции showChannelSGScreen внутри компонента Task и ЗАПУСТИТЬ задачу перед тем, как начать перемещаться по экранам.

Всего наилучшего!!!

person ganka    schedule 08.01.2018

Привет, сообщество. Я создаю приложение Roku, и мне нужно создать экземпляр окна, чтобы можно было перемещаться между ним. Разработка находится внутри основной функции, потому что это единственный способ, которым она работает.

Также мне нужно создать несколько модулей, которые не зависят от основного, которые я исследовал и которые необходимы для использования и задачи узлов.

Это мой код. Интересно, есть ли у вас пример использования узлов и задач?

    screen = CreateObject("roSGScreen")
     m.port = CreateObject("roMessagePort")
     screen.setMessagePort(m.port)
     scene = screen.CreateScene("PlayerScreen")
     screen.show()
person Daniel Márquez    schedule 18.06.2021
comment
Привет Даниэль и добро пожаловать в сообщество Stackoverflow! Чтобы кто-то мог вам помочь, создайте новый вопрос. Если вы разместите здесь сообщение под этим вопросом, никто не сможет найти ваш вопрос и помочь вам. Спасибо! Вот ссылка: stackoverflow.com/questions/ask - person neowinston; 18.06.2021