von Service gestarteten thread immer auf ui thread laufen lassen

  • Hi ich hab in einem Service einem window manager (mit system_overlay) eine view geadded die einen thread (in onCreate() ) startet.
    Diese verschwindet jedoch manchmal weil der thread die onDraw Methode nicht mehr aufruft(in einem loop)also dachte ich das er beendet sein worden muss. Das war aber nicht der fall also läuft er nur nicht mehr auf dem UI Thread .
    Weiss jemand wie ich es schaffe das der thread die ganze zeit auf dem UI thread läuft.

  • Ich fürchte, Du hast den Sinn hinter dem Threading nicht verstanden.


    Man benutzt einen Thread, um Arbeit mit den Daten zu erledigen ohne das User Interface zu blockieren.
    Beispielsweise der Bilderdownload in der Facebook App: Obwohl das Bild noch nicht geladen ist, kannst Du weiterhin scrollen und alles bedienen.


    Wenn Du es jetzt schaffst, den Thread auf den UI Thread zu liegen, dann blockierst Du auch den UI Thread.


    Entweder Du willst einen Thread haben. Dann musst Du das ganze so bauen, dass Du an keinen Thread gebunden bist.
    Da Du aber offensichtlich etwas in eine View zeichnen willst, darfst Du keinen Thread benutzen.


    Eventuell könntest Du den Thread durch einen AsyncTask ersetzen.
    Dort bekommst Du regelmäßig Callbacks auf dem UI Thread aufgerufen, in denen Du dann beispielsweise das Neuzeichnen anstoßen könntest.
    Allerdings musst Du penibel darauf aufpassen, dass da keinerlei veränderbare Daten hin und her geschoben werden, da der Hintergrundthread immer weiter läuft und Dir damit permanent die Daten übern Haufen werfen kann.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Achso, ich hab mir jetzt auch mal LogCat angesehen und als ich die app beendete(also nicht nur home button sondern ganz), verschwand das Bild wie immer vom Bildschirm und kam nach ca 5sec wieder stand da :"Scheduling restart of crashed service in 5000ms"weiß jemand wie ich vorbeuge, dass der service "crasht"

  • Wenn Du Deine App komplett beendest, killst Du damit auch alle Hintergrundprozesse, Services etc.pp.
    Im besten Fall kannst Du das über die Settings->Apps->«App Name»->Stoppen erreichen.


    Du kannst nur verhindern, dass Dein Service abschmiert, in dem Du dafür sorgst, dass er nicht an die laufende App gebunden ist.
    Da Du nicht nur auf den UI Thread sondern sicherlich auch auf irgend einen Kontext zugreifen musst, der nach Beenden der App weg ist, stürzt Dir Dein Service logischerweise ab.


    Eine Mischung aus "works as intended" und "you're doing it wrong"


    Davon ab habe ich den Sinn dahinter, irgendwas über alle anderen Fenster zeichnen zu wollen, absolut nicht verstanden.
    Insofern gehe ich davon aus, dass Du einem falschen Ansatz hinterher rennst.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Nein, das heißt nicht, dass der Fehler bei Intent i = new(this, my_service.class); liegt.
    Wie Du so einen Intent erzeugst ist ja völlig egal.


    Der Fehler liegt in Deinem Service: dieser verlässt sich auf die Existenz eines Context im Intent.
    Dieser liegt aber maximal in einem von drei Konstruktoren vor und kann auch zur Laufzeit wieder verschwinden.
    (Genau genommen in zwei von sechs, was am Verhältnis nichts ändert.)


    Du brauchst aber einen Context um zu zeichnen.
    Die logische Schlussfolgerung: Du kannst aus einem Thread heraus nicht zuverlässig auf die UI zugreifen, wenn Du keine App mitlieferst, die ein dafür vorgesehenes UI hat.


    Du hast im Grunde genommen folgende drei Möglichkeiten:
    1) Pack einfach eine App drum rum.
    2) Wenn Du ein Widget bauen willst, dann lies Dir die Dokumentationen zum Bau von Widgets durch.
    3) Wenn Du ähnlich wie in den Entwickleroptionen über sämtliche Views im Vordergrund irgendwas zeichnen willst, lass es sein.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Wo zeichnet denn bitte die Musik irgendwas hin? 8|


    Audio ist was völlig Anderes, die ist nicht an einen Context gebunden.
    Aber auch da geht nicht alles. Wenn Du beispielsweise eine Telefonieapp baust und neben dem Telefonieren Musik hörst, kannst Du unmöglich die Musik auf den externen Lautsprecher und die Telefonie auf den internen Lautsprecher oben lenken.


    Geht dann plötzlich beides über dieselbe Audioroute.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!