Bonjour,
Je réalise une application dans laquelle il y a une GridView, en WXGA il y a 36 vignettes qui s'affichent, dans chaque vignette il y a un bitmap.
En fait les images sont stocké dans une base de données en Blob.
L'application les télécharge et les stock dans la base de donnée SQLite en Blob.
Ensuite l'application récupère un byte[] qui est transformé en Bitmap, comme ça :
Là j'ai mis un SampleSize de 8, du coup les images sont très petites.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public Bitmap byteToBitmap(byte[] image){ BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inSampleSize = 8; opt.inTempStorage = new byte[16 * 1024]; Bitmap bm = BitmapFactory.decodeByteArray(image, 0, image.length, opt); return bm; }
En fait le téléchargement à lieu dans l'Adapter, j'ai créer une classe qu'extends CursorAdapter et qui implémente :
Je n'utilise pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part public View getView(int position, View convertView, ViewGroup parent)
ni :
Code : Sélectionner tout - Visualiser dans une fenêtre à part public void bindView(View view, Context context, Cursor cursor)
Je n'ai pas compris comment elles fonctionnaient, j'ai l'impression qu'il faut mettre 2 fois le même code quasiment.
Code : Sélectionner tout - Visualiser dans une fenêtre à part public View newView(Context context, Cursor cursor, ViewGroup parent)
Donc dans cet Adapter je regarde un HashMap <String, boolean> la clé en String est l'adresse de l'image et le boolean c'est pour dire si elle est en train d'être téléchargé ou si c'est la première fois qu'on affiche la vignette.
Et si l'image n'a pas encore été téléchargé je créer une instance de classe qui extends AsyncTask <String, Void, Bitmap>, c'est plutôt sympa car en PostExecute ça setImageBitmap sur une ImageView et les vignettes apparaissent petit à petit.
Par contre ça créer 36 threads en même temps la première fois
Et du coup ça peut provoquer :
java.lang.OutOfMemoryError
Comment dois-je gérer la mémoire ?
Est-ce que c'est une mauvaise idée de faire une AsyncTask par vignette ou est-ce que je devrais tout télécharger dans un seul thread ?
Si vous avez des conseils à me donner, merci de m'en faire part.
Ici on parle de téléchargé des images :
http://android-developers.blogspot.f...rformance.html
Ça fait quelque chose comme ça :
http://code.google.com/p/android-ima...ownloader.java
Partager