Ciao a tutti,
Effettuando una chiamata a webservice .net il telefono mi va in outofmemory.
Ho cercato in google ma la maggior parte delle soluzioni non mi risolvono il problema :((
Spero che qualcuno di voi mi possa aiutare :D.
Ciao
Renato
Visualizzazione stampabile
Ciao a tutti,
Effettuando una chiamata a webservice .net il telefono mi va in outofmemory.
Ho cercato in google ma la maggior parte delle soluzioni non mi risolvono il problema :((
Spero che qualcuno di voi mi possa aiutare :D.
Ciao
Renato
Hai implementato ksoap2? Puoi postare il logcat dell'errore?
Inviato dal mio Galaxy Nexus con Tapatalk 2
l'errore è solo out of memory. perè ecco il logcat.
spero in una mano
codice:10-18 10:34:47.112: E/dalvikvm-heap(546): Out of memory on a 33553936-byte allocation.
10-18 10:34:47.112: I/dalvikvm(546): "AsyncTask #1" prio=5 tid=11 RUNNABLE
10-18 10:34:47.112: I/dalvikvm(546): | group="main" sCount=0 dsCount=0 obj=0x413f7ec0 self=0x1941b8
10-18 10:34:47.112: I/dalvikvm(546): | sysTid=565 nice=10 sched=0/0 cgrp=bg_non_interactive handle=2401696
10-18 10:34:47.112: I/dalvikvm(546): | schedstat=( 24535987471 184956447367 2276 ) utm=1713 stm=740 core=0
10-18 10:34:47.112: I/dalvikvm(546): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:~91)
10-18 10:34:47.112: I/dalvikvm(546): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
10-18 10:34:47.112: I/dalvikvm(546): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:204)
10-18 10:34:47.112: I/dalvikvm(546): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96)
10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync.dosync(webservicesync.java:331)
10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync.access$0(webservicesync.java:183)
10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync$sTask.doInBackground(webservicesync.java:542)
10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync$sTask.doInBackground(webservicesync.java:1)
10-18 10:34:47.112: I/dalvikvm(546): at android.os.AsyncTask$2.call(AsyncTask.java:264)
10-18 10:34:47.112: I/dalvikvm(546): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-18 10:34:47.112: I/dalvikvm(546): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-18 10:34:47.112: I/dalvikvm(546): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
10-18 10:34:47.112: I/dalvikvm(546): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-18 10:34:47.112: I/dalvikvm(546): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-18 10:34:47.112: I/dalvikvm(546): at java.lang.Thread.run(Thread.java:856)
10-18 10:34:47.433: W/System.err(546): java.lang.OutOfMemoryError
10-18 10:34:47.482: W/System.err(546): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
10-18 10:34:47.482: W/System.err(546): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
10-18 10:34:47.552: W/System.err(546): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:204)
10-18 10:34:47.552: W/System.err(546): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96)
10-18 10:34:47.572: W/System.err(546): at skolidspeak.test.test.webservicesync.dosync(webservicesync.java:331)
10-18 10:34:47.634: W/System.err(546): at skolidspeak.test.test.webservicesync.access$0(webservicesync.java:183)
10-18 10:34:47.663: W/System.err(546): at skolidspeak.test.test.webservicesync$sTask.doInBackground(webservicesync.java:542)
10-18 10:34:47.742: W/System.err(546): at skolidspeak.test.test.webservicesync$sTask.doInBackground(webservicesync.java:1)
10-18 10:34:47.752: W/System.err(546): at android.os.AsyncTask$2.call(AsyncTask.java:264)
10-18 10:34:47.852: W/System.err(546): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-18 10:34:47.862: W/System.err(546): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-18 10:34:47.862: W/System.err(546): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
10-18 10:34:48.004: W/System.err(546): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-18 10:34:48.102: W/System.err(546): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-18 10:34:48.262: W/System.err(546): at java.lang.Thread.run(Thread.java:856)
ciao Renato
Hum, potrebbe essere che la risposta soap sia estremamente grande.
Nelle righe di codice del codice sorgente indicato nel logcat:
che operazioni svolgi?codice:10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync.dosync(webservicesync.java:331)
10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync.access$0(webservicesync.java:183)
10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync$sTask.doInBackground(webservicesync.java:542)
10-18 10:34:47.112: I/dalvikvm(546): at skolidspeak.test.test.webservicesync$sTask.doInBackground(webservicesync.java:1)
Ad ogni modo, se è vero che la risposta soap è davvero molto grande, dovrai provare e memorizzarla direttamente in un file su sd (FileOutputStream/ OutputStreamWriter), per poi leggerla con un Xmlparser
ti confermo che è mi ritorna un soap estremamente grande tu hai un link con un esempio per gestire FileOutputStream/ OutputStreamWriter?
comunque nella activity faccio la chiamata al webservice e scrivo su di un database basta tutto qui.
Grazie della risposta
ciao
Renato
Quindi hai già verificato che è il ritorno soap ad essere grande.
Hai individuato esattamente la riga del codice sorgente java da dove si inizia a propagare l'errore di out of memory, potresti postare il metodo dove è contenuta?
p.s. al di là della memorizzazione in db, dove memorizzi la risposta al termine della chiamata attualmente?
Che ordine di grandezza c'è? Io, ad esempio, manipolo delle immagini convertite in Base64 di circa 12/15kb senza alcun errore di out of memory
Scusa se ti rispondo solo oggi ma non ero a casa confermo che la il soap è grande molto grande
l'errore me lo da in fase di chiamata.
il mio problema è che non so mai la dimensione della risposta perchè dipende da quante attività scarico, e dipendono a loro volta dalla data di modifica.
codice:if(att.isChecked()==true){
String response=null;
// VMRuntime.getRuntime().setMinimumHeapSize("240M") ;
ActivityManager am = ((ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE));
int largeMemory = am.getLargeMemoryClass();
int memory= am.getMemoryClass();
//faccio la chiamata e passo un codicche mi identificherà la chiamata anche al ritorno
final HttpTransportSE androidHttpTransport1 = new HttpTransportSE(URL,TIMEOUT);
try {androidHttpTransport1.debug=true;
//this is the actual part that will call the webservice
androidHttpTransport1.call("http://tempuri.org/GetAttivita", envelope1);
; // response=androidHttpTransport1.responseDump;
} catch (Exception e) {String ss = e.toString();
write(ss);
e.printStackTrace();}
SoapObject result1 = null;
Object objTestNull = null;//in intestazione
objTestNull = envelope1.bodyIn;
if (objTestNull!=null){
try {
result1 = (SoapObject) envelope1.getResponse();
} catch (SoapFault e) {write("get response att");
String ss = e.toString();
write(ss);
e.printStackTrace();
}
for (int i = 0; i < result1.getPropertyCount(); i++){
int p=result1.getPropertyCount();
// TODO Auto-generated catch block
objTestNull = null;
if (result1 != null){
Boolean ese=null;
//String codat,String op,String codanag,Boolean ese,String grup,String rif,String obj,String tipo,String desc,String rich,String dat,String ora,String codes
String codat= ((SoapObject) result1.getProperty(i)).getProperty("Id").toString();
String op= ((SoapObject) result1.getProperty(i)).getProperty("CodiceUtente").toString();
ese=Boolean.getBoolean(((SoapObject) result1.getProperty(i)).getProperty("isEseguito").toString());
String codanag= ((SoapObject) result1.getProperty(i)).getProperty("CodiceAnagrafica").toString();
String grup= ((SoapObject) result1.getProperty(i)).getProperty("CodiceGruppoAttivita").toString();
String rif= ((SoapObject) result1.getProperty(i)).getProperty("ContattoNominativo").toString();
String obj= ((SoapObject) result1.getProperty(i)).getProperty("Oggetto").toString();
String tipo= ((SoapObject) result1.getProperty(i)).getProperty("CodiceTipoAttivita").toString();
String desc= ((SoapObject) result1.getProperty(i)).getProperty("Descrizione").toString();
String rich= ((SoapObject) result1.getProperty(i)).getProperty("Richiesta").toString();
String dat= ((SoapObject) result1.getProperty(i)).getProperty("DataEffettivo").toString();
String ora= ((SoapObject) result1.getProperty(i)).getProperty("OraEffettivo").toString();
String codes= ((SoapObject) result1.getProperty(i)).getProperty("CodiceEsito").toString();
//carico attività in database
writedbatt(Utente,codat,op,codanag,ese,grup,rif,obj,tipo,desc,rich,dat,ora,codes);
String oper=Ut.getText().toString();
if(oper.compareTo(op)==0/*&& ese==true*/)
writedbscad(Utente,codat,op,codanag,ese,grup,rif,obj,tipo,desc,rich,dat,ora,codes);
System.gc();
Runtime.getRuntime().gc();
}
}
}
}//FINE INSERT ATT