Autore Topic: "Out of memory" quando creo un BufferedReader  (Letto 719 volte)

Offline maurizio76

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +2
    • Mostra profilo
"Out of memory" quando creo un BufferedReader
« il: 14 Luglio 2011, 19:03:34 CEST »
0
Ciao a tutti
Ho un classe "SocketConnection"  che crea un socket di connessione TCP dichiarata come segue:

Codice (Java): [Seleziona]
public  class SocketConnection{
    Socket clientSocket;    
    BufferedReader in=null;
    PrintWriter out=null;
    InputStreamReader isr;    
   
        //************* COSTRUTTORE    
        SocketConnection(String address, int port) throws UnknownHostException, IOException
        {
                clientSocket = new Socket(address, port);
                isr = new InputStreamReader( clientSocket.getInputStream());
                 in = new BufferedReader(isr);                 
                OutputStreamWriter osw = new OutputStreamWriter(clientSocket.getOutputStream());
                BufferedWriter bw = new BufferedWriter(osw);
                out = new PrintWriter(bw, true);
                out.flush();
        }
}

Quando all'interno della mia activity richiamo più volte il costruttore della classe (per creare una connessione) con un istruzione del tipo
cMC = new SocketConnection(myCurrentIP, port);
e viene eseguita l'istruzione seguente:
 in = new BufferedReader(isr);          

si genera un eccezione "OutOfMemoryError at java.io.BufferedReader"
per cui l'applicazione va in crash.

Ho provato anche quanto segue ma senza risolvere il problema
1)ho dichiaratoe un istanza della classe come variabile globale del tipo
   public static  SocketConnection sC;
  Per cui non creo tante istanze della classe ma una sola

2)Ho provato a settare a null la variabile "in" di tipo BufferedReader e poi ad eseguire l'istruzione
        System.gc();//forza il garbage collector
       
   
Potete aiutarmi a trovare una soluzione?come dovrei dichiarare la variabile?
Dove sbaglio?

« Ultima modifica: 14 Luglio 2011, 19:08:19 CEST da Ricky`, Reason: formattazione del codice »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:"Out of memory" quando creo un BufferedReader
« Risposta #1 il: 15 Luglio 2011, 10:25:25 CEST »
0
Prova a dare una dimensione al buffer che crei.
Probabilmente è molto grande, di default, per cui hai l'errore.

Codice (Java): [Seleziona]
in = new BufferedReader(isr, size);          
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline maurizio76

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +2
    • Mostra profilo
Re:"Out of memory" quando creo un BufferedReader
« Risposta #2 il: 15 Luglio 2011, 19:10:40 CEST »
0
Ho provato a settare varie dimensioni e anche a lasciare quella di default (di default il buffer size è 8192 bytes )ma il problema rimane: qualunque sia la dimensione l'errore  già dopo 3 creazioni  del buffer appare "out of memory".Effettivamente è strano....non capisco come mai.

P.S. Il tablet su cui sviluppo  ha 512 Mbyte di memoria RAM.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:"Out of memory" quando creo un BufferedReader
« Risposta #3 il: 15 Luglio 2011, 21:04:32 CEST »
0
prova quando fai la out.flush a "svuotare" i buffer di in
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline maurizio76

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: +2
    • Mostra profilo
Re:"Out of memory" quando creo un BufferedReader
« Risposta #4 il: 13 Settembre 2011, 09:55:57 CEST »
0
Ciao
Ho risolto dichiarando  il socket di tipo public e come variabile generale/globale del programma (in modo da creare solo un buffer e non tanti buffer)in una activity del tipo:

 public  class MyApplicationConfiguration extends Application{
     public static  SocketConnection socket;
}

e ho dimensionato  il mio buffer come segue
int sizeMax=20000;   //Fare attenzione a come impostare la dimensione ideale del buffer :
                                //in quanto se è troppo alta appare errore  OutOfMemoryError 
          in = new BufferedReader(isr,sizeMax);