2014-06-05 5 views
0

J'utilise une requête http lib pour récupérer du contenu xml. L'auditeur du lib a les fonctions suivantes:android chaîne concat OutOfMemoryError

void onDataReceived(char[] data) 
{ 

} 

void onRequestSucceeded() 
{ 

} 

Après avoir demandé une URL, la lib recevra les données dans de nombreuses pièces, quand chaque donnée est reçue, la fonction onDataReceived sera appelée, et cette pièce des données seront passées en paramètre, et je dois concaténer toutes les pièces en une seule chaîne. Et après que la demande est terminée, la fonction onRequestSucceeded sera appelée et la chaîne est maintenant le contenu complet du fichier XML.

Je fais comme ceci:

//init the result string 
String resStr = new String(""); 

void onDataReceived(char[] data) 
{ 
    resStr += new String(data); 
} 

void onRequestSucceeded() 
{ 
    //now the resStr is ready for parse. 
} 

Le problème est, parfois mon appareil Android rapport OutOfMemoryError lorsque concating la chaîne. Alors j'ai changé pour StringBuffer comme ceci:

//init the result string 
StringBuffer resStr = new StringBuffer(""); 

void onDataReceived(char[] data) 
{ 
    resStr.append(data); 
} 

void onRequestSucceeded() 
{ 
    //now the resStr is ready for parse. 
} 

Mais resStr.toString() me donne le contenu bizarre comme "@bsdawevas". Je pense qu'il y a quelque chose qui ne va pas dans l'encodage, mais je ne sais pas comment le résoudre.

Des idées?

+0

essayer d'écrire smth comme ceci: resStr.append (new String (données)) –

Répondre

0

Essayez resStr.append(new String(data));

+0

I Je ne sais pas pourquoi vous avez voté, mais vous avez résolu mon problème. Mais je doute que cela provoque aussi OutOfMemoryError. – Wood

+0

Je suis en train de tester si cela peut provoquer OutOfMemoryError maintenant. – Wood

+0

La concaténation de chaînes est très inefficace dans la plupart des scénarios, utilisez plutôt StringBuilder ou String.format. Avec le 'StringBuilder', vous ne devriez pas avoir de problèmes de mémoire. –

0

utilisation

String str = resStr.toString(); 
System.out.println(str); 

toString() va convertir StringBuffer pour objet chaîne