Italian App "legnosa"

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho praticamente terminato una app (SONO QUI) che svolge un servizio di geolocalizzazione personale finalizzato principalmente alla sicurezza in montagna. Attualmente è in fase molto avanzata di alpha testing ed è scaricabile da Google Play solo su invito. I tester non mi hanno evidenziato errori o defaillance se non quella riportata qui sotto.
Al link www.lalpinistavirtuale.it/sonoqui qualche particolare in più circa questo servizio e questa app.
C'è solo un punto a cui bisognerebbe rimediare.
L'app dopo un paio d'ore di normale utilizzo diventa un po' "legnosa" ossia stenta a ricevere i comandi (pressione sui vari pulsanti, digitazione di qualche breve testo, scroll di un menu, ecc.); sembra che ad essa sia dedicata una piccola percentuale della CPU o (che è lo stesso) ci sia qualcosaltro che le impedisce di essere pronta e reattiva come lo è non appena avviata (e per almeno un'ora).
Mi rendo conto che è difficile che qualche membro del forum posso darmi qualche aiuto perchè non conosce e non ha sottomano il codice (una decina di Activity e 1 Service). Ci tento ugualmente e fornisco qualche ulteriore dettaglio :
- la "famigerata" istruzione DoEvents non esiste e l'ho sostituita, quando veramente necessario, da un Sleep(0);
- la finestra dei logs evidenzia solamente 8 o 9 "Non tutti i punti chiave del codice restituiscono un valore, warning #2" in corrispondenza di
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
    If KeyCode = KeyCodes.KEYCODE_BACK Then
        Activity.Finish
    End If
End Sub
In realtà non so come rimediare ma non credo che sia importante questo warning.
- nessuna variabile, sub o libreria (17 in totale) non utilizzata;
- ho tentato a risolvere il problema con quello che ho capito della funzione PhoneWakeState: nessun risultato positivo;
- memore di passati linguaggi ho utilizzato anche il "garbage collection" pensando che con il tempo si potesse accumulare della "spazzatura" in memoria: niente di risolutivo;
- poichè la parte del codice che più viene eseguita è la sub GPS_LocationChanged (Location1 As Location) che fa parte di GPSService ho fissato in particolare l'attenzione su questa sub che peraltro contiene solo codice che mi pare assolutamente innocuo;
- ci sono un paio di timer in funzione, uno (A) settato a 1 secondo e l'altro (B) a qualche decina di secondi;
- il Service viene avviato con un pulsante che esegue
B4X:
If GPSservice.gpsStarted=False Then
        StartService(GPSservice)
End If
e stoppato alla fine dell'esecuzione dell'app; lo stesso per i timer.

Qualcuno può darmi qualche suggerimento, qualche spunto da sviluppare per risolvere il problema ?
Grazie per l'attenzione.
 

LucaMs

Expert
Licensed User
Longtime User
Se ti può consolare, una mia app si chiude da sé dopo un tot di tempo d'utilizzo (un'oretta, suppongo) senza motivo apparente (non ha nemmeno servizi vari, tranne lo Starter, né timer).

Non penso che questo ti consoli molto, però :p


la finestra dei logs evidenzia solamente 8 o 9 "Non tutti i punti chiave del codice restituiscono un valore, warning #2" in corrispondenza di
Non è questo il punto ma puoi risolverlo. La routine è una funzione, restituisce un boolean; è sufficiente mettere un Return False alla fine.


memore di passati linguaggi ho utilizzato anche il "garbage collection" pensando che con il tempo si potesse accumulare della "spazzatura" in memoria
In effetti, una delle cose da considerare è la memoria che rimane a disposizione nel tempo. Potresti fargli fare un log ogni tot minuti per verificare quanta ne abbia ancora.



ci sono un paio di timer in funzione, uno (A) settato a 1 secondo
Questo è il mio sospettato preferito :). Un timer che scatti ogni secondo consuma parecchia batteria e non è improbabile che le prestazioni peggiorino al diminuire della carica di questa, secondo me.


upload_2017-11-13_13-6-13.png
 
Last edited:
D

Deleted member 103

Guest
Non sò, forse potrebbe essere qualche impostazione del cellulare per risparmiare energia?
Come hai già schritto, è difficile senza codice dare qualche risposta.
 

Star-Dust

Expert
Licensed User
Se fosse stata spugnosa avrei detto l'umidità.. Ma legnosa non saprei...:p:p:p

Sembra come se avesse consumato le risorse e risponda con lentezza. Hai monitorato CPU e ram?
Succede solo quando usi la tua App o anche altre app con servizi in background?
 

Star-Dust

Expert
Licensed User
Potrebbe anche essere qualche altra App. A me succede in un dispositivo che uso per fare i test delle mie App.
Appena ho installato un gioco molto pesante adesso va molto lento sopratutto se lo metto in backgroud per passare a vedere un altra App.
 

valentino s

Active Member
Licensed User
Azzardo.
Gli smartphone non sono progettati per far funzionare una app a lungo. I sistemi operativi possono intervenire in vario modo, anche killando il task.
Renderlo lento ... e' strano. Rallenta tutto lo smartphone o solo l'app ?
Se e' l'app probabilmente c'e' qualche problema di variabile / oggetto che diventa enorme, che occupa tanta memoria.
In poche parole dovresti settare un evento cron ogni 5-10-15 minuti invece che uno sleep.
Come ? Non l'ho ancora fatto, sorry.
 

Star-Dust

Expert
Licensed User
Un altra cosa che mi é venuta in mente. A volte problemi simili si ottengono quando si mettono in coda molte operazioni che la CPU non riesce a eseguire per tempo. Quindi le operazioni della UI rallentano perché la CPU sta eseguendo in Background operazioni rimaste in coda (forse ripetitive o inutili).

Con PhoneState mantieni la CPU accesa, non va ma in StandBy, ma il problema non sembra quello.


P.S. DoEvents non é famigerata e se eventualmente genererebbe dei Crash non rallentamenti.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Attivi e stoppi il service del GPS ad ogni ricerca di posizione? Usi una list per memorizzare le posizioni? Attivare e disattivare il GPS così spesso lo manda nel pallone , e se usi una lista questa si riempie diventando troppo grande, forse questo è il problema?
 

AlpVir

Well-Known Member
Licensed User
Longtime User
@LucaMs: "Non tutti i punti chiave del codice ..." : Verificherò.
Anch'io pensato ad un problema di memoria ma la "garbage collection" (che ho implementato) non ha risolto alcunchè. Avrebbe dovuto ripulire la memoria ogni tot minuti; se lo ha fatto non ho visto risultati apprezzabili.
Non mi sembra che le prestazioni dello smartphone peggiorino. Non comunque a questo livello (a volte 2-3 secondi per premere un pulsante ed attendere la risposta !)

@Filippo: non ci sono impostazioni particolari del cellulare. Dopo 2 o 3 ore la batteria è al 70%-80% e non penso che la CPU lavori men che bene.

@Star-Dust: Come verificare CPU e RAM ?. Mi riprometto di farlo (sono prove che durano svariate ore). In effetti nella sub sub GPS_LocationChanged (Location1 As Location) c'è un CallSub(Main,"VisualizzaElementiAttuali2") che interviene nella UI.
Proverò ad eliminarlo (solo temporaneamente, perchè fa parte della struttura dell'app)

@valentino s: Non ho utilizzato uno sleep ma un timer settato a 2-5-10-15 minuti (generalmente a 10 minuti). Poi c'è l'altro timer settato ad 1 secondo.

Una ulteriore precisazione. L'app, una volta avviata, si "iconeggia"; parte il service e il timer; acquisisce le coordinate e lavora in background. E' visibile solo un'icona nell'area delle notifiche e per rivedere le schermate dell'app (per modificare qualcosa, visualizzare una mappa o altro) bisogna fare uno swipe su quest'area.

Grazie a tutti per i suggerimenti. Riferirò il risultato di queste prove (lunghe)
 

Star-Dust

Expert
Licensed User
@LucaMs: "Non tutti i punti chiave del codice ..." : Verificherò.
Anch'io pensato ad un problema di memoria ma la "garbage collection" (che ho implementato) non ha risolto alcunchè. Avrebbe dovuto ripulire la memoria ogni tot minuti; se lo ha fatto non ho visto risultati apprezzabili.
Non mi sembra che le prestazioni dello smartphone peggiorino. Non comunque a questo livello (a volte 2-3 secondi per premere un pulsante ed attendere la risposta !)

@Filippo: non ci sono impostazioni particolari del cellulare. Dopo 2 o 3 ore la batteria è al 70%-80% e non penso che la CPU lavori men che bene.

@Star-Dust: Come verificare CPU e RAM ?. Mi riprometto di farlo (sono prove che durano svariate ore). In effetti nella sub sub GPS_LocationChanged (Location1 As Location) c'è un CallSub(Main,"VisualizzaElementiAttuali2") che interviene nella UI.
Proverò ad eliminarlo (solo temporaneamente, perchè fa parte della struttura dell'app)

@valentino s: Non ho utilizzato uno sleep ma un timer settato a 2-5-10-15 minuti (generalmente a 10 minuti). Poi c'è l'altro timer settato ad 1 secondo.

Una ulteriore precisazione. L'app, una volta avviata, si "iconeggia"; parte il service e il timer; acquisisce le coordinate e lavora in background. E' visibile solo un'icona nell'area delle notifiche e per rivedere le schermate dell'app (per modificare qualcosa, visualizzare una mappa o altro) bisogna fare uno swipe su quest'area.

Grazie a tutti per i suggerimenti. Riferirò il risultato di queste prove (lunghe)
In molti dispositivi c'é la possibilità di vedere le statistiche dell'uso della CPU e anche il monitoraggio nelle Impostazioni.
Esiste anche una libreria se non mi sbaglio (vedi in quelle di Don Manfred)
Lo stesso per la Memoria, nelle impostazioni diversi device ti permettono di monitorarla.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
In Impostazioni - Memoria - App - IN USO
che riporta "Mostra servizi in esecuzione" non viene elencata la mia app. Eppure è lì che sta lavorando da mezz'ora.

Nelle "Opzioni sviluppatore" - "Statistiche sui processi"
- Sono qui 25%
- B4A Bridge 28%
- molte altre hanno valori prossimi al 99%

Nelle "Opzioni sviluppatore" - "Mostra utilizzo CPU" vengono elencate una serie di .... servizi ? ... più o meno ogni secondo e quindi sonio difficili da leggere (anche perchè il loro ordine varia continuamente)
Tra questi servizi c'è (quasi sempre) il mio "alpvir.sonoqui". C'è anche un "gpsd" che probabilmente fa riferimento al GPS.
In alto ci sono 3 numeri tutti con valori prossimi a 3 o 4.
Cosa significheranno ?
C'è anche un piccolissimo grafico a barre orizzontali, anch'esso di significato sconosciuto.
Servirà interpretare questi dati ?
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Sembra di capire che quei nomi sono elencati in ordine di occupazione (di memoria ?)
Ma quanta ?
Sarà così ?
 

Star-Dust

Expert
Licensed User
Adesso non ho davanti e me lo dovrei studiare. Ma se cerchi nel web trovi le spiegazioni che ti servono.

Ma non trascurare l'osservazione del Timer a 1 secondo
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho trovato qualche spiegazione circa il "Mostra utilizzo CPU", ma non sembrano utili. L'utilizzo CPU è all'incirca dello 0.1-0.2 %
Il Service parte e non si ferma più.
Il Timer ad 1 secondo serve principalmente per fornire l'ora precisa al secondo in tempo reale. Forse posso passare ad un'ora precisa al minuto; potrebbe nessere sufficiente per i miei scopi.
Ho comunque individuato un possibile probabile fronte di attacco, ma le prove dureranno diverse ore.
 

Emme Developer

Well-Known Member
Licensed User
Ho trovato qualche spiegazione circa il "Mostra utilizzo CPU", ma non sembrano utili. L'utilizzo CPU è all'incirca dello 0.1-0.2 %
Il Service parte e non si ferma più.
Il Timer ad 1 secondo serve principalmente per fornire l'ora precisa al secondo in tempo reale. Forse posso passare ad un'ora precisa al minuto; potrebbe nessere sufficiente per i miei scopi.
Ho comunque individuato un possibile probabile fronte di attacco, ma le prove dureranno diverse ore.
Il timer non serve impostarlo ad 1, ha poco senso, se non mostri i secondi. Avvia l'app, prendi il tempo corrente e trovi la differenza tra now e il minuto prossimo. Usa uno sleep con la differenza che hai trovato e avvia il timer con tick 1 minuto. In questo modo hai già reso il processo computazionale 1/60 di quel che era prima. Puoi anche usare un while 1 con lo sleep di 1 minuto, non so dirti a livello di performance quale sia meglio
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho trovato la causa del problema !
Da un paio d'ore l'app è in funzione e non si vedono quelle "legnosità" che forse hanno fatto sorridere qualcuno; l'app è reattiva proprio come al momento dell'avvio.

Una stringa veniva sommata a se stessa e, dopo un po', questo processo rallentava l'app a causa delle dimensioni troppo grandi della stringa stessa.
Avevo previsto tutto questo ed avevo predisposto una funzione che estraeva solo la parte finale di questa stringa, quella parte cioè che a me interessava veramente; la parte iniziale per me non era interessante. In tal modo la stringa non avrebbe superato una certa limitata lunghezza.
Solo che questa funzione, quando l'app era "iconata" (ma con GPS service attivo), non veniva richiamata e la stringa cresceva cresceva senza freno.
Non questioni di timer settati ad un secondo (che comunque - riconosco - possono stressare più del dovuto un'app) ma altro.
Grazie a tutti per gli spunti che mi hanno consentito di risolvere il problema.
 

Emme Developer

Well-Known Member
Licensed User
Ho trovato la causa del problema !
Da un paio d'ore l'app è in funzione e non si vedono quelle "legnosità" che forse hanno fatto sorridere qualcuno; l'app è reattiva proprio come al momento dell'avvio.

Una stringa veniva sommata a se stessa e, dopo un po', questo processo rallentava l'app a causa delle dimensioni troppo grandi della stringa stessa.
Avevo previsto tutto questo ed avevo predisposto una funzione che estraeva solo la parte finale di questa stringa, quella parte cioè che a me interessava veramente; la parte iniziale per me non era interessante. In tal modo la stringa non avrebbe superato una certa limitata lunghezza.
Solo che questa funzione, quando l'app era "iconata" (ma con GPS service attivo), non veniva richiamata e la stringa cresceva cresceva senza freno.
Non questioni di timer settati ad un secondo (che comunque - riconosco - possono stressare più del dovuto un'app) ma altro.
Grazie a tutti per gli spunti che mi hanno consentito di risolvere il problema.
Non sommare mai stringhe a se stesse o roba del genere. Il tipo stringa quando viene operato ricrea un nuovo oggetto stringa, perché un oggetto immutabile. Utilizza StringBuilder, le operazioni sono molto molto più veloci.
Ti consiglio di seguire questo tutorial: https://www.b4x.com/android/forum/threads/get-a-random-string.75903/
 

Star-Dust

Expert
Licensed User
Ho trovato la causa del problema !
Da un paio d'ore l'app è in funzione e non si vedono quelle "legnosità" che forse hanno fatto sorridere qualcuno; l'app è reattiva proprio come al momento dell'avvio.

Una stringa veniva sommata a se stessa e, dopo un po', questo processo rallentava l'app a causa delle dimensioni troppo grandi della stringa stessa.
Avevo previsto tutto questo ed avevo predisposto una funzione che estraeva solo la parte finale di questa stringa, quella parte cioè che a me interessava veramente; la parte iniziale per me non era interessante. In tal modo la stringa non avrebbe superato una certa limitata lunghezza.
Solo che questa funzione, quando l'app era "iconata" (ma con GPS service attivo), non veniva richiamata e la stringa cresceva cresceva senza freno.
Non questioni di timer settati ad un secondo (che comunque - riconosco - possono stressare più del dovuto un'app) ma altro.
Grazie a tutti per gli spunti che mi hanno consentito di risolvere il problema.
Non avendo il codice a disposizione i suggerimenti che abbiamo potuto darti (alla cieca) era il massimo che potevamo.
 
Top