Pyjnius: ' Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann ihre Ansichten berühren.' Fehler beim Versuch, auf android.view.Window-Methoden zuzugreifen

Erstellt am 15. Dez. 2018  ·  1Kommentar  ·  Quelle: 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()

Der gleiche Fehler tritt auf, wenn eine andere Methode von 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

Hilfreichster Kommentar

Der Fehler bedeutet im Grunde, dass Sie PyJNIus und Ihre Anwendung in einem Nicht-Haupt- Thread ausführen, was das Standardverhalten für Android ist, glaube ich. Korrigiere mich, wenn ich falsch liege.

Stellen Sie es sich wie eine Kivy-Hauptschleife vor, die verschiedene Ereignisse abfragt und was Sie versuchen zu tun, ist wie sleep(1) . Standardmäßig würden Sie Ihre Benutzeroberfläche in Kivy einfrieren, es sei denn, Sie verwenden kivy.clock.Clock , aber Android erlaubt Ihnen so etwas nicht. Sie müssen Ihren Code explizit auf dem Haupt Thread über java.lang.Runnable und android.app.Activity.runOnUiThread ausführen, zB wie in diesem Beispiel .

Oder Sie können das Verhalten einfach aus dem android Paket in android.runnable.run_on_ui_thread importieren, aber vergessen Sie nicht, es auch Ihren Anforderungen hinzuzufügen!

>Alle Kommentare

Der Fehler bedeutet im Grunde, dass Sie PyJNIus und Ihre Anwendung in einem Nicht-Haupt- Thread ausführen, was das Standardverhalten für Android ist, glaube ich. Korrigiere mich, wenn ich falsch liege.

Stellen Sie es sich wie eine Kivy-Hauptschleife vor, die verschiedene Ereignisse abfragt und was Sie versuchen zu tun, ist wie sleep(1) . Standardmäßig würden Sie Ihre Benutzeroberfläche in Kivy einfrieren, es sei denn, Sie verwenden kivy.clock.Clock , aber Android erlaubt Ihnen so etwas nicht. Sie müssen Ihren Code explizit auf dem Haupt Thread über java.lang.Runnable und android.app.Activity.runOnUiThread ausführen, zB wie in diesem Beispiel .

Oder Sie können das Verhalten einfach aus dem android Paket in android.runnable.run_on_ui_thread importieren, aber vergessen Sie nicht, es auch Ihren Anforderungen hinzuzufügen!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen