Italian Kill Job ?

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho una app con 2 activity.
Dalla prima lancio la seconda e nella seconda ho un pulsante A con un Activity con cui, volendo, concludo l'activity (con un Activity.finish) e ritorno alla prima.
Tutto banale e molto semplice.
In una fase successiva ho dovuto inserire in Activity_resume della seconda attività il seguente codice

B4X:
 Dim jobDataPanorama  As  HttpJob
   Dim S     As String
   S="http://" & Main.SitoMio & "/Panorami/" & NomeFile
   jobDataPanorama.Initialize("jobDataPanorama", Me)
   jobDataPanorama.Download (S)

Il Job dura qualche secondo e, per quello che qui interessa, non fa nulla di particolare.

Capita che se premo il pulsante A dopo 4 o 5 secondi da che è stata attivata la seconda activity tutto va bene.
Ma se lo premo dopo 1 o 2 secondi (ossia appena la seconda activity è visualizzata) si ritorna immediatamente alla prima activity (il che è corretto) e poi, immancabilmente, dopo 3 o 4 secondi, alla seconda. E questo è scorretto !
Senza che si faccia niente, nota bene.

Una prima soluzione, che ho già sperimentato ed è efficace, sarebbe quella di visualizzare il pulsante A solo alla fine di JobDone ma ciò non è pienamente soddisfacente in quanto per 4 o 5 secondi l'utente non sa come fare per ritornare alla prima activity.

Evidentemente capita che quando il Job è già stato avviato non è più possibile stopparlo, neanche dichiarando Globals jobDataPanorama e inserendo un jobDataPanorama.release. Evidentemente il job procede per i fatti suoi in un processo parallelo a quello delle altre activity. Per lo meno questa è la spiegazione che mi son data.
Ci vorrebbe un kill job o qualcosa del genere. Esiste ?
Suggerimenti ?
Grazie per l'attenzione.
 

udg

Expert
Licensed User
Longtime User
Dai un'occhiata qui per cancellare un download in corso. Se non ricordo male esistono altre soluzioni che prevedono la modifica dei moduli okHttp/okHttpUtils; prova a cercare nel forum con chiavi tipo "cancel download" e simili.
 

LucaMs

Expert
Licensed User
Longtime User
Il NON lavoro mi sta uccidendo (ma non solo questo).

My job is killing, me sarebbe più esatto (ma conosco solo l'inglese che si parla a Zagarolo e zone limiNtrofe).

"kill job" dovrebbe significare "uccidi il job"

(job killer?)

[Mi sta venendo il dubbio di essere di nuovo OT-timo :p]
 

LucaMs

Expert
Licensed User
Longtime User
Ma se lo premo dopo 1 o 2 secondi (ossia appena la seconda activity è visualizzata) si ritorna immediatamente alla prima activity (il che è corretto) e poi, immancabilmente, dopo 3 o 4 secondi, alla seconda. E questo è scorretto !
Non mi è chiarissima la situazione ma se stai dicendo che inaspettatamente si riapra la seconda activity direi che è probabile che il job usi qualche CallSubDelayed che attivi appunto questa seconda Activity.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
@udg: ho riscritto l'app utilizzando la libreria okhttp invece della http ed il problema non si è più ripresentato.
@LucaMs: il problema non era dovuto a qualche CallSubDelayed ma a fattori che rimangono misteriosi a cui ho rimediato riscrivendo l'app.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Activity.finish non distrugge la activity ma la rende "invisibile" eventuale codice ancora attivo rimane per l'appunto attivo, e proprio il job restando attivo, riapriva la activity per dirti che ha finito... insomma avevi un job educato :D:D
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Grazie. Ottima spiegazione.
Una prima soluzione, che ho già sperimentato ed è efficace, sarebbe quella di visualizzare il pulsante A solo alla fine di JobDone ma ciò non è pienamente soddisfacente in quanto per 4 o 5 secondi l'utente non sa come fare per ritornare alla prima activity.

io continuerei con questa soluzione, eventualmente una semplice label per spiegare cosa accade, e/o un pulsante per bloccare il download come suggerito da @udg
 

LucaMs

Expert
Licensed User
Longtime User
Activity.finish non distrugge la activity ma la rende "invisibile" eventuale codice ancora attivo rimane per l'appunto attivo, e proprio il job restando attivo, riapriva la activity per dirti che ha finito... insomma avevi un job educato :D:D
Mica tanto; quando "riavvii" un'Activity chiusa con Activity.Finish, verrà eseguita nuovamente la Activity_Create, mentre se non lo usi, partirà direttamente la Activity_Resume.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Mica tanto; quando "riavvii" un'Activity chiusa con Activity.Finish, verrà eseguita nuovamente la Activity_Create, mentre se non lo usi, partirà direttamente la Activity_Resume.
giusto, ma il job resta attivo, in android non esiste un vero e proprio kill, non come su windows dove se chiudi un applicazione viene scaricata completamente dalla memoria, in android le app sono sempre un minimo attive
 

PCastagnetti

Member
Licensed User
Longtime User
Anche io tempo fa mi sono trovato di fronte allo stesso problema;nel mio caso a volte veniva completamente perso l'evento jobdone.
Ho risolto spostando tutte le chiamate http, in sub pubbliche contenute in un servizio (anche l'evento jobdone) .
In questo modo l'evento viene sempre eseguito nel servizio, indipendente dall'activity che ha eseguito la sub (per questo motivo dovrebbe risolvere il problema di @AlpVir )
Per capire quale activity ha eseguito il job, puoi inizializzare i job con un parametro che li differenzi.
Con questa soluzione ,l'evento jobdone viene generato anche se l'applicazione viene ridotta con il tasto home (cosa che non succede se il job è stato eseguito da una activity)
Spero di essere stato utile.
 

udg

Expert
Licensed User
Longtime User
ExitApplication uccide la app.
Vero, ma Erel spesso ricorda che Android vede un'app terminata in questo modo come se avesse subito un crash e quindi, in generale, lo sconsiglia.
 

MarcoRome

Expert
Licensed User
Longtime User
Per stoppare eventuali letture Job, come suggerito da Erel tempo fa è possibile inserire nel JobDone ---> IsPaused(Me)
esempio:

B4X:
Sub JobDone (Job As HttpJob)
   if IsPaused(Me) then 
            Return
   End If
    Log("JobName = " & Job.JobName & ", Success = " & Job.Success)
    If Job.Success Then
    Dim res As String
        res = Job.GetString
        Log("Response from server: " & res)
        Dim parser As JSONParser
        parser.Initialize(res)
        Select Job.JobName
       
         Case "verificaimei"
...

In questo modo se l'activity è in pause ( esempio Activity.Finish ) il Job non viene eseguito e le finestre non verranno più aperte
 
Top