Italian Problema di OUT OF MEMORY con web service

gdelvecchio

Member
Licensed User
Longtime User
Ciao a tutti

Ho un problema di memoria con la sincranizzazione dei dati della mia app.

Se eseguo due sincronizzazioni dati vicine mi ritorna sempre un problema di memoria che vi posto:

B4X:
java.lang.OutOfMemoryError
   at org.apache.http.util.CharArrayBuffer.expand(CharArrayBuffer.java:59)
   at org.apache.http.util.CharArrayBuffer.append(CharArrayBuffer.java:77)
   at org.apache.http.util.EntityUtils.toString(EntityUtils.java:136)
   at anywheresoftware.b4a.http.HttpClientWrapper$HttpResponeWrapper.GetString(HttpClientWrapper.java:471)
   at info_mobile.b4a.sel_func._hc_responsesuccess(sel_func.java:1337)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at anywheresoftware.b4a.BA.raiseEvent2(BA.java:167)
   at anywheresoftware.b4a.BA$3.run(BA.java:303)
   at android.os.Handler.handleCallback(Handler.java:615)
   at android.os.Handler.dispatchMessage(Handler.java:92)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:4898)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
   at dalvik.system.NativeStart.main(Native Method)

Che dite ???? :sign0163:

Stò facendo un pò di studi ed il problema è quando scrivo sul mio database interno dopo aver inviato e ricevuto i dati.

Tenete conto che eseguo tre cicli di scrittura su db consecutivi e l'ultimo mi scrive circa 2000 righe.

Nel ciclo faccio sempre la begin transaction, trasactionsuccesful e endtransaction.

Cosa posso fare???

Sapete qualche comando o libreria per gestire la memoria e liberarla ???


Attendo con ansia qualche risposta


Grazie a tutti
 

ivanomonti

Expert
Licensed User
Longtime User
credo sia un fattore di sicurezza, invece di scrivere 2000 record in un ciclo, fai una mega query di 2000 record e invii in una volta sola

apri db
query;query;query;query...
commit
chiudi db

forse questo dovrebbe bastare, altra soluzione

apri db
for
thread con query
next
chiudi

poi dimmi
 

gdelvecchio

Member
Licensed User
Longtime User
Ciao Ivano

e grazie per la risposta ma alla fine funziona così...

Si devono fare transazioni con poche righe al massimo 1000 e la memoria non si satura.
Impostando un contatore di ultima riga è facilissimo!

Poi ho utilizzato la libreria OPERATING SYSTEM e con quella verifico la memoria e quando è alta imposto un "setlowmemory" così android fa partire il garbage collector.

Quindi ho modificato tutti i miei import dati e con mio stupore ho velocizzato di molto la mia sincronizzazione dati completa.

Con un s3 era già veloce ma con galaxy S no!
Adesso con il galaxy S ci mette 30 secondi contro i 3 minuti di prima.

Se vuoi posto un pò di codice

Ciao
 

ivanomonti

Expert
Licensed User
Longtime User
Ciao Ivano

e grazie per la risposta ma alla fine funziona così...

Si devono fare transazioni con poche righe al massimo 1000 e la memoria non si satura.
Impostando un contatore di ultima riga è facilissimo!

Poi ho utilizzato la libreria OPERATING SYSTEM e con quella verifico la memoria e quando è alta imposto un "setlowmemory" così android fa partire il garbage collector.

Quindi ho modificato tutti i miei import dati e con mio stupore ho velocizzato di molto la mia sincronizzazione dati completa.

Con un s3 era già veloce ma con galaxy S no!
Adesso con il galaxy S ci mette 30 secondi contro i 3 minuti di prima.

Se vuoi posto un pò di codice

Ciao

Perchè no, il codice aiuta sempre.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Mi faccio portavoce di tutta la comunità e chiedo a gran voce il codice promesso.
Grazie anticipatamente
 

giannimaione

Well-Known Member
Licensed User
Longtime User
Mi faccio portavoce di tutta la comunità e chiedo a gran voce il codice promesso.
Grazie anticipatamente
mi nomimo "sotto_portavoce" di AlpVir e a squarciagola invoco il benemerito codice :)
 

gdelvecchio

Member
Licensed User
Longtime User
SCUSATE A TUTTI!!!
Purtroppo sono stato via per lavoro e dopo ho avuto troppi casini!!!
:BangHead::BangHead:
Fate conto che 2 mesi che non tocco il mio amato B4A!!!!!
:BangHead::BangHead::BangHead:

Allora ecco un pò di codice per gestire il telefono:
B4X:
Sub setlowmem 
Dim OS As OperatingSystem
OS.setLowMemory
End Sub

Sub Check_processi_telefono

   Dim OS As OperatingSystem
   Dim memoria As Long = OS.AvailableMemory
   Log("Lista processi"& OS.getRunningServices(100))
   Log("Memoria libera:"& memoria)
   Log("CPU Utilizzata: "& OS.calculateCPUusage)
   Log("Task in esecuzione: " & OS.getRunningTasks(100))
   OS.setLowMemory
   OS.killBackgroundProcesses("info_mobile.b4a")
   
End Sub

Il setlowmem indica al device di aumentare la ram disponibile.
Il checkprocessi vi aiuta a sapere cosa succede sul device.
Mi raccomando dovete importare la libreria OSLibrary 1.40 che vi mette a disposizione un pò di metodi.

Se volete qualche altra cosa rispetto a questo post chiedete.
 
Top