German Problem mit einer langen Service Ausführung

PeBo007

Member
Licensed User
Hallo alle miteinander,

seit einigen Stunden plage ich mich mit einem sehr nervigen Problem herum und zwar, dass ich einen Service einfach nicht ohne Unterbrechung lange ausführen kann.
Egal was ich auch ausprobiert habe, die Ausführung des Service will einfach nicht ohne Unterbrechung funktionieren...

Die Aufgabe meines Service sollte sein, mittels einer Do Until Loop - Schleife solange Zufallszahlen zu erzeugen und mit vorgegebenen Zahlen zu vergleichen, bis die Abbruchbedingung erfüllt ist.
Anschließend sollten der Service wieder gestoppt und diverse Werte aus dem Schleifendurchlauf in der Activity angezeigt werden
Das könnten unter Umständen mehrere Millionen Schleifendurchläufe und somit einige Minuten Laufzeit bedeuten.

Bei der Ursachenforschung bin ich zu dem Ergebnis gekommen, dass trotz deklarierens des Service als "Vordergrund-Service", das Betriebssystem den Service offensichtlich trotzdem killt und ihn anschließend nach einigen Sekunden erneut startet.
Der erneute, automatische Start des Service nützt mir allerdings nichts, weil von dem Servicemodul und sowohl auch von der Activity die Routinen "Process_Globals" durchlaufen und alle Variablen erneut initialisiert werden.
Somit gehen die Werte der Variablen für den Schleifendurchlaufzähler und des Grenzwertes für die Abbruchbedingung verloren bzw. auf Null.
Weiterhin lässt sich auch nachdem der Service vom Betriebssystem gekillt und erneut gestartet wurde die Activity nicht mehr anzeigen.
Lediglich der Titel wird dann noch angezeigt aber keine View-Objekte mehr.
Solange ich aber mit der Ausführungsdauer der Schleife unterhalb der Zeit bleibe wo wohl sonst das Betriebssystem den Service killen würde, funktioniert alles.
Es muss doch möglich sein eine Schleife in einem Service und somit den Service solange auszuführen bis irgendwann einmal die Abbruchbedingung erreicht ist und dann anschließend den Service zu stoppen???

Ich würde mich sehr freuen, wenn mir bei meinem Problem jemand helfen und mir den entscheidenden Tipp oder gar eine Lösung liefern könnte.
Vielen Dank schon einmal im vorraus!

Zur Deklaration als Vordergrund-Service habe ich folgende Anweisungen im Servicemodul verwendet in:

#Region Service Attributes
#StartAtBoot: False
#StartCommandReturnValue: android.app.Service.START_STICKY

und in:

Sub Service_Start(StartingIntent As Intent)
notification1.SetInfo("Servicetest", "Die App läuft nun im Hintergrund!", Main)
notification1.Light = True
notification1.Sound = False
notification1.Vibrate = False
notification1.AutoCancel = True
Service.StartForeground(1, notification1)
 

Filippo

Expert
Licensed User
Hallo PeBo007,

verschiebe alle Process_Globals-Variablen von der Activity unter "Process_Globals" vom Service.
Mach die initialiesierung unter "Sub Service_Create"
B4X:
Sub Service_Create
notification1.SetInfo("Servicetest", "Die App läuft nun im Hintergrund!", Main)
notification1.Light = True
notification1.Sound = False
notification1.Vibrate = False
notification1.AutoCancel = True
End Sub
Sub Service_Start (StartingIntent As Intent)
   Service.StartForeground(1,n)
    ...
End Sub
 

PeBo007

Member
Licensed User
Hallo Filippo,

Danke für deine Unterstützung.
Ich habe den Code wie vorgeschlagen abgeändert und getestet, doch leider ohne Erfolg.
Nach rund 960000 Schleifendurchläufen wird der Service offensichtlich weiterhin gekillt und es erfolgt dieser Log-Eintrag:
Fatal signal 6 (SIGABRT) at 0x000023e8 (code=0), thread 14123 (servicetest.de)

Anschließend nach so etwa 6 Sekunden fängt der Service automatisch wieder an zu laufen.
Allerdings wurden dabei auch alle Variablen initialisiert so, dass nun die Abbruchbedingung nicht mehr erfüllt werden kann.
Ich habe alternativ auch probiert den Code aus der Schleife in einem Timer auszuführen, welchen ich dann im Servicemodul ausführe.
Das funktioniert zwar ohne Probleme, aber selbst wenn ich diesen im 1ms Intervall betreibe ist die Ausführung doch viel, viel langsamer als in der Schleife.
 

Filippo

Expert
Licensed User
Dann musst du ein Thread verwenden.
z.B. so:
B4X:
Sub Process_Globals
  Private myThread As Thread
End Sub

Sub Service_Create
notification1.SetInfo("Servicetest", "Die App läuft nun im Hintergrund!", Main)
notification1.Light = True
notification1.Sound = False
notification1.Vibrate = False
notification1.AutoCancel = True

  myThread.Initialise("myThread ")

End Sub

Sub Service_Start (StartingIntent AsIntent)
 Service.StartForeground(1,n)
  Dim args(0) As Object
  myThread .Start(Me,"go_myThread ", args)
 ...
End Sub

Sub go_myThread  
  Do While true
    
     deine routine

    myThread.Sleep(5)
   Loop
End Sub
 
Top