Pyjnius: ' Seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues.' erreur lors de la tentative d'accès aux méthodes android.view.Window

Créé le 15 déc. 2018  ·  1Commentaire  ·  Source: 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()

La même erreur se produit lors de l'utilisation d'une méthode différente 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

Commentaire le plus utile

L'erreur signifie essentiellement que vous exécutez PyJNIus, et votre application, dans un Thread non principal qui est le comportement par défaut pour Android, je crois. Corrige moi si je me trompe.

Imaginez-le comme une boucle principale Kivy qui interroge divers événements et ce que vous essayez de faire est comme sleep(1) . Par défaut, vous gèleriez votre interface utilisateur dans Kivy à moins d'utiliser kivy.clock.Clock , mais ce que fait Android, c'est qu'il ne vous permet pas de faire quelque chose comme ça. Vous devrez exécuter explicitement votre code sur le Thread via java.lang.Runnable et android.app.Activity.runOnUiThread , par exemple comme cet exemple .

Ou, vous pouvez simplement importer le comportement du package android dans android.runnable.run_on_ui_thread , mais n'oubliez pas de l'ajouter également à vos exigences !

>Tous les commentaires

L'erreur signifie essentiellement que vous exécutez PyJNIus, et votre application, dans un Thread non principal qui est le comportement par défaut pour Android, je crois. Corrige moi si je me trompe.

Imaginez-le comme une boucle principale Kivy qui interroge divers événements et ce que vous essayez de faire est comme sleep(1) . Par défaut, vous gèleriez votre interface utilisateur dans Kivy à moins d'utiliser kivy.clock.Clock , mais ce que fait Android, c'est qu'il ne vous permet pas de faire quelque chose comme ça. Vous devrez exécuter explicitement votre code sur le Thread via java.lang.Runnable et android.app.Activity.runOnUiThread , par exemple comme cet exemple .

Ou, vous pouvez simplement importer le comportement du package android dans android.runnable.run_on_ui_thread , mais n'oubliez pas de l'ajouter également à vos exigences !

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Thrameos picture Thrameos  ·  27Commentaires

enjoybeta picture enjoybeta  ·  8Commentaires

ignertic picture ignertic  ·  4Commentaires

cmacdonald picture cmacdonald  ·  20Commentaires

stania picture stania  ·  6Commentaires