Pyjnius: 'Apenas o thread original que criou uma hierarquia de visualização pode tocar suas visualizações.' erro ao tentar acessar os métodos android.view.Window

Criado em 15 dez. 2018  ·  1Comentário  ·  Fonte: kivy/pyjnius

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from jnius import autoclass

CurrentActivity  = autoclass('org.kivy.android.PythonActivity').mActivity
view = CurrentActivity.getWindow().getDecorView()
view.setKeepScreenOn(True)

class Root(RelativeLayout):
    def __init__(self):
        super().__init__()

class SomeApp(App):
    def build(self):
        return Root()

SomeApp().run()

O mesmo erro ocorre ao usar um método diferente de android.view.Window :

CurrentActivity  = autoclass('org.kivy.android.PythonActivity').mActivity
WindowManager = autoclass('android.view.WindowManager$LayoutParams')
CurrentActivity.getWindow().addFlags(WindowManager.FLAG_KEEP_SCREEN_ON)
Kivy 1.10.1
Python 3.6
12-15 16:48:21.692 18623 18646 I python  :  Traceback (most recent call last):
12-15 16:48:21.692 18623 18646 I python  : WARNING:kivy:stderr: Traceback (most recent call last):
12-15 16:48:21.693 18623 18646 I python  :    File "main.py", line 20, in <module>
12-15 16:48:21.693 18623 18646 I python  : WARNING:kivy:stderr:   File "main.py", line 20, in <module>
12-15 16:48:21.694 18623 18646 I python  :      view.setKeepScreenOn(True)
12-15 16:48:21.694 18623 18646 I python  : WARNING:kivy:stderr:     view.setKeepScreenOn(True)
12-15 16:48:21.695 18623 18646 I python  :    File "jnius/jnius_export_class.pxi", line 734, in jnius.JavaMethod.__call__ (jnius/jnius.c:25894)
12-15 16:48:21.695 18623 18646 I python  : WARNING:kivy:stderr:   File "jnius/jnius_export_class.pxi", line 734, in jnius.JavaMethod.__call__ (jnius/jnius.c:25894)
12-15 16:48:21.697 18623 18646 I python  :    File "jnius/jnius_export_class.pxi", line 828, in jnius.JavaMethod.call_method (jnius/jnius.c:27082)
12-15 16:48:21.697 18623 18646 I python  : WARNING:kivy:stderr:   File "jnius/jnius_export_class.pxi", line 828, in jnius.JavaMethod.call_method (jnius/jnius.c:27082)
12-15 16:48:21.698 18623 18646 I python  :    File "jnius/jnius_utils.pxi", line 93, in jnius.check_exception (jnius/jnius.c:4012)
12-15 16:48:21.698 18623 18646 I python  : WARNING:kivy:stderr:   File "jnius/jnius_utils.pxi", line 93, in jnius.check_exception (jnius/jnius.c:4012)
12-15 16:48:21.699 18623 18646 I python  :  jnius.JavaException: JVM exception occurred: Only the original thread that created a view hierarchy can touch its views.
12-15 16:48:21.699 18623 18646 I python  : WARNING:kivy:stderr: jnius.JavaException: JVM exception occurred: Only the original thread that created a view hierarchy can touch its views.
12-15 16:48:21.822 18623 18646 I python  : Python for android ended.
12-15 16:48:21.830 18623 18623 V SDL     : onWindowFocusChanged(): false
12-15 16:48:21.833 18623 18623 V PythonActivity: onPause()
12-15 16:48:21.833 18623 18623 V SDL     : onPause()
12-15 16:48:21.833 18623 18623 V SDL     : nativePause()
12-15 16:48:21.833 18623 18623 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 18623 (ample.myaasdqpp)
support upstream

Comentários muito úteis

O erro basicamente significa que você está executando o PyJNIus e seu aplicativo em um Thread não principal, que é o comportamento padrão do Android, acredito. Corrija-me se eu estiver errado.

Imagine-o como um loop principal Kivy que pesquisa vários eventos e o que você tenta fazer é sleep(1) . Por padrão, você congelaria sua IU no Kivy a menos que usasse kivy.clock.Clock , mas o que o Android faz é não permitir que você faça nada parecido. Você precisará executar explicitamente seu código no Thread por meio de java.lang.Runnable e android.app.Activity.runOnUiThread , por exemplo, como neste exemplo .

Ou você pode apenas importar o comportamento do pacote android em android.runnable.run_on_ui_thread , mas não se esqueça de adicioná-lo aos seus requisitos também!

>Todos os comentários

O erro basicamente significa que você está executando o PyJNIus e seu aplicativo em um Thread não principal, que é o comportamento padrão do Android, acredito. Corrija-me se eu estiver errado.

Imagine-o como um loop principal Kivy que pesquisa vários eventos e o que você tenta fazer é sleep(1) . Por padrão, você congelaria sua IU no Kivy a menos que usasse kivy.clock.Clock , mas o que o Android faz é não permitir que você faça nada parecido. Você precisará executar explicitamente seu código no Thread por meio de java.lang.Runnable e android.app.Activity.runOnUiThread , por exemplo, como neste exemplo .

Ou você pode apenas importar o comportamento do pacote android em android.runnable.run_on_ui_thread , mas não se esqueça de adicioná-lo aos seus requisitos também!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Hukuta picture Hukuta  ·  5Comentários

apalala picture apalala  ·  7Comentários

stania picture stania  ·  6Comentários

tom19952000 picture tom19952000  ·  15Comentários

etc0de picture etc0de  ·  5Comentários