Italian L'applicazione si è bloccata in modo anomalo

Star-Dust

Expert
Licensed User
Longtime User
Il modulo service Starter è questo:

B4X:
#Region  Service Attributes
    #StartAtBoot: False
    #ExcludeFromLibrary: True
#End Region

Sub Process_Globals
    Public connected As Boolean
    Private client As Socket
    Public server As ServerSocket
    Private astream As AsyncStreams
    Private const PORT As Int = 51042
    '-------------------------------------------
    Private logs As StringBuilder
    Private logcat As LogCat
    Private const emailAddress As String = "[email protected]"
End Sub

Sub Service_Create
    server.Initialize(PORT, "server")
    server.Listen
End Sub

Sub Server_NewConnection (Successful As Boolean, NewSocket As Socket)
    If Successful Then
        CloseExistingConnection
        client = NewSocket
        astream.InitializePrefix(client.InputStream, False, client.OutputStream, "astream")
        UpdateState(True)
    End If
    server.Listen
End Sub

Sub Service_Start (StartingIntent As Intent)

End Sub

Public Sub ConnectToServer(Host As String)
    Log("Trying to connect to: " & Host)
    CloseExistingConnection
    Dim client As Socket
    client.Initialize("client")
    client.Connect(Host, PORT, 10000)
End Sub

Public Sub Disconnect
    CloseExistingConnection
End Sub

Sub Client_Connected (Successful As Boolean)
    If Successful Then
        astream.InitializePrefix(client.InputStream, False, client.OutputStream, "astream")
        UpdateState (True)
        '''ToastMessageShow("CONNESSIONE ATTIVA!",True)
        Return True
    Else
        ToastMessageShow("ASSENZA DI CONNESSIONE!",True)
        Return False
    End If
End Sub

Sub CloseExistingConnection
    If astream.IsInitialized Then astream.Close
    If client.IsInitialized Then client.Close
    UpdateState (False)
End Sub

Sub UpdateState (NewState As Boolean)
    connected = NewState
    CallSub(Main, "SetState")
End Sub

Sub AStream_Error
    UpdateState(False)
End Sub

Sub AStream_Terminated
    UpdateState(False)
End Sub

Sub AStream_NewData (Buffer() As Byte)
    CallSub2(Main, "RX_Dati", Buffer)
End Sub

Public Sub SendData (data() As Byte)
    If connected Then
        astream.Write(data)
    Else
        ToastMessageShow("LA TRASMISSIONE DEL DATO NON E' AVVENUTA!",False)
    End If
End Sub


'Return true to allow the OS default exceptions handler to handle the uncaught exception.
Sub Application_Error1 (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub Service_Destroy

End Sub

Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    'wait for 500ms to allow the logs to be updated.
    Dim jo As JavaObject
    Dim l As Long = 500
    jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l))
    logcat.LogCatStop
    logs.Append(StackTrace).Append(CRLF).Append(Error)
    Dim email As Email
    email.To.Add(emailAddress)
    email.Subject = "Pippo - crashed"
    email.Body = logs
    StartActivity(email.GetIntent)
    ToastMessageShow("APP CRASHED" & CRLF & " send email to developer",False)
    '''Return True
End Sub

Credo che il problema sta proprio in Starter ecco perché non ti segnala errore. Crasha prima
Il server e tutte le altre cose devi metterle in un altro servizio, Stater non deve stare in background.

Da Stater tu avvii un altro servizio che stara in ascolto nella porta del server.
Se fai stare il Servizio partente sempre attivo, non chiude, non si distrugge, darà problemi, Leggiti i post di erel, da qualche parte lo ha scritto. E' cosi per tutti i servizi che partono all'avio anche quelli che avviano al BOOT del dispositivo (StartAtBoot: True per intenderci) devono avviar eun secondo servizio e distruggersi.

Prova e facci sapere
 

Star-Dust

Expert
Licensed User
Longtime User
Si vede che sono rimasto indietro, tempo fà non c'era questa possibilità.
Farò una provola; eventualmente il problema potrebbe essere il secondo, ovvero le impostazioni dei log sul dispositivo.
Dal 6.8+ (anche sul tanto amato 7.01 c'è)
 

StefanoTag

Active Member
Licensed User
Longtime User
Credo che il problema sta proprio in Starter ecco perché non ti segnala errore. Crasha prima....

L'App non "crasha" assolutamente nè all'inizio nè in altro momento. In genere l'App funziona bene! Quando però io aggiungo nuovi moduli o correggo quelli già presenti o scrivo nuovo codice e magari commetto qualche errore (anche banale) e poi compilo, l'App continua a funzionare bene, finchè non incappa in un eventuale errore e a quel punto "mi fa una pernacchia" invece di segnalarmi cosa, dove e quando...cioè mi dice che il programma si è interrotto, punto e basta.
Quindi non è nemmeno un problema di visualizzare o meno i log (che, tra l'altro, non ho mai usato molto), è proprio un cambio improvviso di comportamento...??... e non capisco da cosa sia originato...
Allego un'immagine per spiegarmi meglio
 

Attachments

  • Prima e adesso.png
    Prima e adesso.png
    191 KB · Views: 181

Star-Dust

Expert
Licensed User
Longtime User
Ho capito non ti intercetta gli errori. Cmq quello che ti ho segnalato una cosa che andrebbe corretta.

poi modifica cosi :
B4X:
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    'wait for 500ms to allow the logs to be updated.
    Dim jo As JavaObject
    Dim l As Long = 500
    jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l))
    logcat.LogCatStop
    logs.Append(StackTrace).Append(CRLF).Append(Error)
    Dim email As Email
    email.To.Add(emailAddress)
    email.Subject = "Pippo - crashed"
    email.Body = logs
    StartActivity(email.GetIntent)
    ToastMessageShow("APP CRASHED" & CRLF & " send email to developer",False)
    Return False
    ' Return False Fa continuare il programma anche se in errore
End Sub

Vedi se sul menu dell'IDE Tools IDE Option Use Legacy debugger sia spuntata

Controlla se lo fa anche in altre App lo stesso percorso o solo in questa. Cosi da capire se qualcosa legata all'app o all'IDE.

Un altra prova e togliere i controlli per intercettare gli errori, (Application_Error, Try Chatch) e compilar ein realease (non obfuscate) cosi vedrai in quale modulo ti da l'errore e che tipo di errore ti segnalal il Java RT

Ci sono molti metodi ....
 
Last edited:

StefanoTag

Active Member
Licensed User
Longtime User
Cmq, il solo msg d'errore (attualmente scomparso) non penso che ti aiuterebbe moltissimo, essendo per qualche classe Java): non sarebbe meglio lanciare l'app in debug mode?

Senza dubbio, durante la scrittura del codice, la modalità 'debug' è sicuramente più eloquente, comunque non è vero che il msg d'errore non aiuta...se non altro comprendi al volo il punto e il motivo dell'interruzione e ti assicuro che per me che ho vissuto alcuni giorni con l'unico e semplice avviso "Procedura interrotta in modo anomalo" vuol dire tantissimo
grazie comunque!
 

StefanoTag

Active Member
Licensed User
Longtime User
Problema risolto!!!!!!!!!!!!!!!!!!!!!!
...e ora che l'ho risolto grazie alle vostre indicazioni, mi appare in tutta la sua banalità...ma forse è sempre così di fronte ai "problemi risolti".
Ho rinominato il modulo Starter con Pippo e ho modificato di conseguenza tutte le relative chiamate a questo servizio. Adesso finalmente, ad ogni errore di codice, ricompare l'amatissimo messaggio d'errore e non l'odiatissimo avviso che tutto si era improvvisamente arrestato.
Dunque tutto dipendeva dalla presenza del modulo service Starter interamente utilizzato per i servizi del WiFi.
La cosa che non capisco (ma il fatto che non lo capisca è del tutto inessenziale!!!) è che il WiFi si attivava solo in una delle 5 opzioni del menù principale dell'App. Per tutte le restanti opzioni, il modulo service Starter restava del tutto "dormiente". Nonostante questo, la sua sola presenza, impediva la generazione del msg di errore...boh...non so...forse sono fuori strada. Comunque adesso sto lavorando senza il modulo Starter e tutto è tornato a funzionare "come una volta"!!!
Grazie di nuovo a tutti i vostri suggerimenti e un grazie particolare a Star Dust che mi ha dedicato qualcosa di più di un minuto del suo tempo...
 

LucaMs

Expert
Licensed User
Longtime User
Puoi ancora ricreare un modulo di servizio Starter (magari copia e incolla da un progetto vuoto). Di sicuro, essendo vuoto, non ti darà problemi e magari ti servirà in futuro (di solito, dati globali da inizializzare una tantum è meglio dichiararli ed inizializzarli in questo servizio).
 

Star-Dust

Expert
Licensed User
Longtime User
Problema risolto!!!!!!!!!!!!!!!!!!!!!!
...e ora che l'ho risolto grazie alle vostre indicazioni, mi appare in tutta la sua banalità...ma forse è sempre così di fronte ai "problemi risolti".
Ho rinominato il modulo Starter con Pippo e ho modificato di conseguenza tutte le relative chiamate a questo servizio. Adesso finalmente, ad ogni errore di codice, ricompare l'amatissimo messaggio d'errore e non l'odiatissimo avviso che tutto si era improvvisamente arrestato.
Dunque tutto dipendeva dalla presenza del modulo service Starter interamente utilizzato per i servizi del WiFi.
La cosa che non capisco (ma il fatto che non lo capisca è del tutto inessenziale!!!) è che il WiFi si attivava solo in una delle 5 opzioni del menù principale dell'App. Per tutte le restanti opzioni, il modulo service Starter restava del tutto "dormiente". Nonostante questo, la sua sola presenza, impediva la generazione del msg di errore...boh...non so...forse sono fuori strada. Comunque adesso sto lavorando senza il modulo Starter e tutto è tornato a funzionare "come una volta"!!!
Grazie di nuovo a tutti i vostri suggerimenti e un grazie particolare a Star Dust che mi ha dedicato qualcosa di più di un minuto del suo tempo...
si ma te lo avevo scritto, sei stato ostinato.;);););)
To avevo detto di spostare i servizi Server su un altra classe....

Mi merito qualche like?
 

StefanoTag

Active Member
Licensed User
Longtime User
si ma te lo avevo scritto, sei stato ostinato.;);););)
To avevo detto di spostare i servizi Server su un altra classe....

...è vero! Ma io sono una matricola del B4A e per me spostare i servizi su un'altra classe significava spostarli dalla 3A alla 5B ;) ...sto scherzando, comunque è vero che non capivo bene cosa volesse dire. Io sono "solo" un insegnante anziano che, su grande insistenza da parte di alcuni suoi alunni, prova, in ore pomeridiane, a dare loro qualche infarinatura sulla creazione delle App...e comunque mi ci sto appassionando perdavvero!
 

udg

Expert
Licensed User
Longtime User
Io sono "solo" un insegnante anziano che, su grande insistenza da parte di alcuni suoi alunni, prova, in ore pomeridiane, a dare loro qualche infarinatura sulla creazione delle App
Ti dispiacerebbe dire loro da parte mia che sono davvero fortunati ad avere un insegnante come te?
Quando ne avrai tempo e voglia, prova a far acquistare alla scuola un mBot (basato su Arduino). Può essere istruttivo e divertente.
 

StefanoTag

Active Member
Licensed User
Longtime User
...Quando ne avrai tempo e voglia, prova a far acquistare alla scuola un mBot (basato su Arduino). Può essere istruttivo e divertente....
La curiosità di capire qualcosa di più delle App & di Android è nata proprio dallo studio e dalle sperimentazioni su Arduino...
 

Sagenut

Expert
Licensed User
Longtime User
Credo che il problema sta proprio in Starter ecco perché non ti segnala errore. Crasha prima
Il server e tutte le altre cose devi metterle in un altro servizio, Stater non deve stare in background.

Da Stater tu avvii un altro servizio che stara in ascolto nella porta del server.
Se fai stare il Servizio partente sempre attivo, non chiude, non si distrugge, darà problemi, Leggiti i post di erel, da qualche parte lo ha scritto. E' cosi per tutti i servizi che partono all'avio anche quelli che avviano al BOOT del dispositivo (StartAtBoot: True per intenderci) devono avviar eun secondo servizio e distruggersi.

Quindi se io devo creare un servizio in una mia app (che sia un server o siano funzioni che devono essere eseguite in continuazione anche quando l'app è chiusa) devo creare un nuovo modulo (o più di uno) Service dove realizzarlo e questo modulo deve essere avviato da Starter che poi non deve contenere altro e addirittura sarebbe meglio distruggerlo?
I servizi non partono insieme all'app? Non sarebbe sufficiente rinominare fin dal principio il modulo Starter con il nome del mio servizio?
 

Star-Dust

Expert
Licensed User
Longtime User
Il servizio Starter è diverso dagli altri servizi . Serve solo per avviare funzioni e operazioni che devono partire prima dell'App. Come ad esempio la verifica se sono presenti file, l'accesso ad SQL e così via poi si conclude qui è non deve avere servizi che rimangono aperti in attesa, in ascolto o timer che continuano a girare perché va in errore.

Dallp Starter puoi avviare altri servizi(classi) che offrono funzioni in background, come listen, timer e altro. Può essere adatto anche ad avviare servizi all'avvio del dispositivo start boot, ma rispettando ciò che ho scritto prima.

Ad esempio io ho fatto un app, chesta al'ascolto per ricevere messaggi SMS e quando li riceve esegue la lettura vocale con il TTS. Ovviamente deve essere disponibile subito all'avvio del cellulare. Per fare questo nello starter ho messo StarBoot = True, ma all'interno il servizio start ho avviato un secondo servizio che sta in ascolto per gli sms. Il servizio starter esiste solo per avviare il servizio SMS invece, e poi si chiude
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
Mi pare una cosa strana tanto quanto quella di creare un Background per ogni view...........se però per qualche motivo è così dovrò ringraziarti di nuovo per avermi insegnato qualcosa che mi risparmierà grattacapi quando avrò bisogno dei Servizi.
 

LucaMs

Expert
Licensed User
Longtime User
Il servizio Starter è diverso dagli. Serve solo per avviare funzioni e operazioni che devono partire prima dell'App.
E' utilissimo anche per l'intercettazione di errori non gestiti (quindi non eliminatelo mai).

C'è anche da considerare che se per qualche motivo l'app si riavvia, parte sempre Starter per primo.

Ero dallo scarpe
Già che ci sei, mi prenderesti un bel mocassino? 43 abbondante, grazie :p
 
Top