Italian JobeDone non viene eseguito e blocca l'applicazione

Teech

Member
Licensed User
Longtime User
Buongiorno. Chiedo un aiuto per un comportamento che non restituisce nessun risultato e nessun errore, per cui non so proprio cosa verificare
Ho il seguente codice:
B4X:
Public Sub GetCustomers(target As Object)
    If Not(m_customers.IsInitialized) Then
        m_customers.Initialize
        Wait For (LoadCustomers(target, "")) Complete (unfinished As String)
        If  unfinished<>"" Then
            LoadCustomers(target, unfinished)
        Else
            Log("DOWNLOADED!!!!!")
        End If
    End If
End Sub
Private Sub LoadCustomers(target As Object, nxt As String) As ResumableSub
    Dim unfinished As String=""
    Dim J As HttpJob
    J.Initialize("customers",target)

    Dim uri As String
    uri=$"https://myurl/customers"$
    If nxt<>"" Then uri=$"${uri}&next=${nxt}"$
    Log(uri)
    j.Download(uri)
    setHeader(j)
   
    Wait For (j) JobDone (j As HttpJob)
    If j.Success Then
        Dim parser As JSONParser
        parser.Initialize(j.GetString)
        Dim root As Map = parser.NextObject
        Dim db As DatabaseManager
        db.Initialize
        db.AddCustomers(root.Get("dati"))
        If root.ContainsKey("next") Then unfinished=root.Get("next")
        Log(unfinished)
    Else
        Log(j.ErrorMessage)
    End If
    j.Release
    Return unfinished
End Sub
Nella chiamata a SetHeader(j) aggiungo gli header richiesti dall'EndPoint e li ho scrupolosamente verificati: fra gli altri ho aggiunbto un timeout di 20 second
La stessa chiamata usando un API Client (uso Insomnia) funziona correttamente.

Il problema è che nella Sub LoadCustomers dopo ma "Wait For (j) JobeDone" il processo si blocca senza raggiungere "If j.Success Then". Il log restituisce
*** Service (httputils2service) Create ***

Dopo circa 30 secondi mi viene restituito il messaggio sul dispositivo "L'App *MyApp* non risponde" con la possibilità di chiudere o attendere (ovviamente chiudo).
L'errore sul Log B4A è il seguente

** Activity (main) Pause, UserClosed = false **
java.lang.RuntimeException: Unable to create service com.mbconsulenze.httputils2service: java.lang.RuntimeException: anywheresoftware.b4a.B4AUncaughtException
at android.app.ActivityThread.handleCreateService(ActivityThread.java:4381)
at android.app.ActivityThread.access$1700(ActivityThread.java:273)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2112)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8107)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: java.lang.RuntimeException: anywheresoftware.b4a.B4AUncaughtException
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:188)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:201)
at com.mbconsulenze.httputils2service.onCreate(httputils2service.java:56)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:4369)
... 8 more
Caused by: anywheresoftware.b4a.B4AUncaughtException
at anywheresoftware.b4a.Msgbox.debugWait(Msgbox.java:210)
at anywheresoftware.b4a.debug.Debug.wait(Debug.java:217)
at anywheresoftware.b4a.shell.Shell.debugPause(Shell.java:544)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:417)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:157)
... 11 more
Ho già aggiornato alla versione 12.20 ma il problema persiste.
Avete suggerimenti?
Grazie
 

MarcoRome

Expert
Licensed User
Longtime User
Prova a sistemare:
1.
B4X:
 J.Initialize("customers",target)
in
B4X:
 J.Initialize("",target)

2.
B4X:
setHeader(j)
Questa non la riesco proprio a capire. Passi ad una sub setHeader ( che non capisco cosa faccia, visto che non hai riportato la stessa ) l'oggetto HttpJob ???
Per passare gli Header vanno impostati nel seguente modo
B4X:
j.GetRequest.SetHeader("user", "xxxx")
Poi non avendo per l'appunto la sub setHeader non idea di cosa hai scritto nella stessa ma di sicuro passi l'oggetto HttpJob il che mi sembra senz'altro sbagliato
 

Teech

Member
Licensed User
Longtime User
Prova a sistemare:
1.
B4X:
 J.Initialize("customers",target)
in
B4X:
 J.Initialize("",target)

2.
B4X:
setHeader(j)
Questa non la riesco proprio a capire. Passi ad una sub setHeader ( che non capisco cosa faccia, visto che non hai riportato la stessa ) l'oggetto HttpJob ???
Per passare gli Header vanno impostati nel seguente modo
B4X:
j.GetRequest.SetHeader("user", "xxxx")
Poi non avendo per l'appunto la sub setHeader non idea di cosa hai scritto nella stessa ma di sicuro passi l'oggetto HttpJob il che mi sembra senz'altro sbagliato
Ho tolto il nome dell'oggetto dal costruttore del HttpJob, ma, essendo solo un'etichetta per la vecchi gestione dell'handle, non ha sortito alcun effetto.

Sul secondo punto, invece, setto gli header in una sub dedicata perchè recupero dei dati da un file di configurazione, li elaboro come mi richiede il webservice (è in locale di un software gestionale), concatenando delle stringhe e codificandole in Base64, e li aggiungo, esattamente con j.GetRequest.SetHeader(nome, valore) per ognuno degli header richiesti. Non penso sia "senz'altro sbagliata" (sarebbe utile sapere il perchè) in considerazione del fatto che, esaminando la variabile 'j', in debug con un breakpoint sulla riga del Wait For (j) trovo gli header correttamente valorizzati (j.req.builder.headers.elementData).
Senza entrare troppo nello specifico delle logiche questi sono gli header che compilo:

B4X:
    j.GetRequest.SetHeader("Dati-Gestionale", "Stringa dati gestionale")
    j.GetRequest.SetHeader("Authorization",aut) <---Dove aut è una stringa elaborata contenente, fra l'altro, le credenziali in base64
    j.GetRequest.SetContentEncoding("utf-8")
    j.GetRequest.Timeout = 20000

Il problema è che non viene sollevato l'evento JobeDone e ricevo l'errore "java.lang.RuntimeException: Unable to create service b4a.example.httputils2service: java.lang.RuntimeException: anywheresoftware.b4a.B4AUncaughtException" dopo diverso tempo di inattività, ma non capisco cosa voglia dire. Sembra che la connessione al webservice parta, ma non esegue la JobDone: non è un problema del webservice in quanto da un API client (uso Insomnia) funziona.
 
Top