German Job abbrechen

SirHarry

Member
Licensed User
Longtime User
Hi. Ich brauch nochmal 'nen Tip.

Ich benütze in meinen Projekten einen HTTP-Job zum Abfragen meiner MySQL-DB.
Dabei entsteht folgendes Problem:

Zum Füllen der Formularfelder frage ich in Activity_Create oder in Activity_resume die Datenbank ab. Die Antwort kommt bekanntlich asyncron mit leichter Verzögerung.
Wenn der Benutzer nun nicht geduldig genug ist und im Programm weiter- oder zurückblättert, ruft der verspätet eintreffende Job die abgebrochene Seite wieder auf. Im schlimmsten Fall kann dadurch das Programm noch nicht einmal mehr abgebrochen werden, da die Seite sich selbst immer wieder neu aufruft.

Gibt es eventuell eine Möglichkeit, z.B. in Activity_Pause einen bereits abgesendeten Job abzubrechen?
Wie kann ich das oben beschriebene Problem verhindern.
 

mw71

Active Member
Licensed User
Longtime User
moin,

evtl. kannst du auch über eine Progressbar o.ä. weitere Eingaben des Users unterbinden bis der Job fertig ist?
 

SirHarry

Member
Licensed User
Longtime User
Hi. Zunächst Mal vielen Dank für die Antworten.

@AnSchi:
Ich arbeite auf den Seiten meiner App mit diversen Jobs.
Dann müsste ich pro Job eine öffentliche Variable deklarieren, damit ich aus Activity_Pause dran komme. Und die dann alle in Activity_Pause mittels release abbrechen.
Ivch weiß nicht, ob Jobdone das auseinander halten kann. Aber werde ich mal testen.
Danke.

@mw71:
Das Bedienen der App-Oberfläche habe ich bereits durch ein durchsichtiges Panel und ProgressDialogShow() gesperrt, damit der User während der Laufzeit der Jobs nicht dran kommt.
Aber er hat ja immer noch den Hardware-Zurück Button des Handys.
Ich weiß nicht, ob ich den sperren kann. Aber das würde ich dennoch nicht machen, denn dann wäre der Benutzer mit Recht etwas sauer, denk ich.
 
Last edited:

SirHarry

Member
Licensed User
Longtime User
Hab Job.release getestet.
Das dient offenbar nicht zum abbrechen laufender Jobs, sondern lediglich zum Freigeben der Recourcen erledigter Jobs:(
Steht ja auch so ähnlich in der Kurzbeschreibung
 

mw71

Active Member
Licensed User
Longtime User
Hab Job.release getestet.
Das dient offenbar nicht zum abbrechen laufender Jobs, sondern lediglich zum Freigeben der Recourcen erledigter Jobs:(
Steht ja auch so ähnlich in der Kurzbeschreibung
ja, glaube ich auch. Habe das mal im Debug Modus gesehen, da wird ein Temp File Gelöscht.



mit:
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean 'return true if you want to consume the event
Log("Key Pressed: " & KeyCode)   

    If KeyCode = KeyCodes.KEYCODE_BACK Then
.......       
        Return True
    End If
End Sub
kannst du die Tasten, in diesem Beispiel die Backtaste, abfangen. Die frage ist dann was du damit machst. Nach deiner Beschreibung würde ich wahrscheinlich eine Abfrage/Hinweis machen das noch Jobs am laufen sind und fragen ob diese wirklich abgebrochen werden sollen (müsstest das Ergebnis dann ignorieren, z.B.)

Eine andere Lösung wäre evtl. verschiedene Jobs für die verschiedenen Aufgaben zu generieren.

Viel Erfolg :)
 

An Schi

Well-Known Member
Licensed User
Oder vielleicht die jobs in einen Service packen, der diese noch fertig laufen lässt, nachdem die app verlassen wurde?
 

SirHarry

Member
Licensed User
Longtime User
"eine Abfrage/Hinweis machen das noch Jobs am laufen sind und fragen ob diese wirklich abgebrochen werden sollen"

Das ist ja gerade mein Problem. Die abgesendeten Jobs lassen sich nicht abbrechen. Sie kommen auf jeden Fall herein!
Und rufen dann, wegen dem 'Me' in
job.Initialize(JobName, Me)
die ursprünglich aufrufende Seite wieder in den Vordergrund, obwohl der Anwender inzwischen auf einer ganz anderen Seite ist.

Anmerkung: Das Problem kommt natürlich nur zum Tragen, wenn man mit einem langsamen Internet arbeitet. So wie ich;)
Aber sollen andere ja auch manchmal haben.
 

mw71

Active Member
Licensed User
Longtime User
Das aufrufen der Seite erfolgt ja aber in der Finish Sub bzw. nach dem Wait Befehl?
Wenn du nun in einer Map, z.B., speicherst welche Jobs laufen und welche abgebrochen werden sollen kannst
du dann, wenn die Daten eingetrudelt sind, prüfen ob diese auch verarbeitet werden sollen.
Alternativ dann Prüfen ob die Seite für die die Daten bestimmt sind noch Sichtbar ist.

So könnte ich mir das zumindest vorstellen.
 

DonManfred

Expert
Licensed User
Longtime User
Zum Füllen der Formularfelder frage ich in Activity_Create oder in Activity_resume die Datenbank ab. Die Antwort kommt bekanntlich asyncron mit leichter Verzögerung.
Wenn der Benutzer nun nicht geduldig genug ist und im Programm weiter- oder zurückblättert, ruft der verspätet eintreffende Job die abgebrochene Seite wieder auf.
Verlagere die DB-Kommunikation in einen Service.
Der läuft auch weiter wenn du die activity wechselst.
Du musst im Service nur dafür sorgen, das die richtige activity das Ergebnis mitgeteilt bekommt.

Der punkt ist, dass Du httpjobs nicht abbrechen kannst.
 
Last edited:

SirHarry

Member
Licensed User
Longtime User
Danke für den Hinweis.
Ich habe mir diese Funktion inzwischen angeschaut und finde sie ausgesprochen gut.
Speziell für eine andere Anfrage von mir (mysql-DB syncron abfragen) in diesem Forum erfüllt sie meine Wünsche vollkommen (mein Dank an Erel;)).
 

KMatle

Expert
Licensed User
Longtime User
obwohl der Anwender inzwischen auf einer ganz anderen Seite ist

1. Das klingt eher nach einem Design-Problem/Programmierfehler
2. Warum laufen die Jobs überhaupt so lange? Normal ist maximal 1-2 Sekunden (ansonsten siehe 1)
3. Wenn etwas "länger" läuft, dann siehe 1
4. Ausnahme: Berechnungen im Bereich Quantenmechanik :)
 

SirHarry

Member
Licensed User
Longtime User
Kann schon sein.;)

Aber wie ist das denn oft in der Realität?
Man klickt in einem menue auf einen Button.
Plötzlich fällt einem ein, dass man eigentlich auf einen ganz anderen Punkt im Menue wollte und klickt den Hardware-Zurück-Button um wieder ins Menue zu kommen. Das Ganze hat möglicherweise nicht mal 2/10 sek. gedauert.

Was der User nicht weiß und auch nicht wisen muss:
Beim versehentlichen Öffnen der Activity hat er eine eine datenbank-Aktion ausgelöst. Die Abfrage zum Füllen, z.B. seiner Anmeldedaten wurde abgesendet. Diese dauert, wie du schon schreibst im Normalfall etwa 1-2 sek. bei meiner Internetverb. hier in der Eifel auch gerne mal 10-15 Sek.:(

Nun hat er also die aufrufende Activity verlassen und ist inzwischen in einer ganz anderen Activity.
Nach einigen Sekunden kommt nun die abgesendete Abfrage zurück und ruft die ehemals aufrufende Activity wieder in den Vordergrund.
Und was macht die wieder beim Öffnen? Sie schickt erneut eine Abfrage an die Datenbank ab.
Der Ping-Pong-Effekt ist da und der User wird rot im Gesicht.
Und zwar egal, ob ich diese einführende Abfrage in der Sub Create oder in Resume unterbringe.

Ein Designfehler wäre übrigens meine Lieblingsantwort;)
Daher suche ich einen Tipp, wie ich das ändern könnte
 

MaFu

Well-Known Member
Licensed User
Longtime User
Datanbankabfrage in Service-Modul. Dabei speichern, welches Activity die Abfrage initiiert hat.
Wenn dann der Job abgeschlossen ist: aktuelle Activity mit der gespeicherten vergleichen und die Daten nur dann übergeben wenn es noch die gleiche ist.
Ich hoffe, das war einigermaßen verständlich.
 
Top