J'essaie de créer une application qui permet de télécharger l'image du serveur et de l'afficher dans la liste. Le problème que j'ai fait était la fuite de la mémoire et faire planter mon application. Je cherchais sur un blog Android tel que celui-ci link, ça montre une super idée mais ce n'est pas encore assez pour le faire avec plusieurs threads. Certains appareils Android peuvent fonctionner avec lui, mais certains appareils ne peuvent gérer que dans un seul thread et parfois, il ne peut pas fonctionner du tout.Android télécharger l'image à partir du serveur et enregistrer sur la carte SD sans utiliser BitmapFactory
Mon application a beaucoup d'activité et chacune d'elles a une Listview qui doit afficher une image aussi vite que possible. Grâce à Google IO 2012, ils utilisent un tampon pour enregistrer l'image originale sur la carte SD et résoudre le problème de mémoire de fuite, mais cela rend le chargement si lent puisque l'image à télécharger était trop grande.
Ma question est: Existe-t-il un moyen de mettre l'image à l'échelle en même temps que d'écrire une image sur la carte SD? Je trouve une solution possible est d'utiliser Skip octet dans l'objet inputtream et j'ai pu trouver Largeur et Hauteur aussi Bit par pixel de l'image que j'ai besoin de télécharger.
Le code suivant a été utilisé dans Google IO 2012 et il fonctionne bien avec plusieurs threads, dans mon cas, j'ai 4 threads en arrière-plan.
private void downloadAndWriteFile(final String url, final File file) throws OutOfMemoryError {
BufferedOutputStream out = null;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setDoInput(true);
conn.connect();
final InputStream in = new BufferedInputStream(conn.getInputStream(), IO_BUFFER_SIZE_BYTES); // buffer size 1KB
out = new BufferedOutputStream(new FileOutputStream(file), IO_BUFFER_SIZE_BYTES);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
out.close();
conn.disconnect();
}
catch (Exception e) {
Log.e(TAG, "!!downloadAndWriteFile " + e.getMessage());
file.delete();
}
}
Merci pour votre réponse, j'étais déjà à travers ce cas, mais il y a toujours une mémoire de fuite avec plusieurs threads pour certains périphériques qui ne permettent pas à JNI d'allouer plus de mémoire. Le code de Google IO 2012 peut le faire fonctionner avec plusieurs threads qui supportent tous les périphériques, mais il est si lent au cas où l'image est trop grande. D'une manière ou d'une autre, l'utilisateur navigue rapidement, donc lors du premier chargement, ce n'est pas bon du tout. – vsatkh