Aller au contenu

Fuite de memoire


Morgan26

Recommended Posts

Bonjour,

J'utilise dans une application a de nombreuses reprise cette fonction :

    private void downloadImage(String s, ImageView image) {
       Bitmap bitmap = null;
       try {
           URL urlImage = new URL(s);
           HttpURLConnection connection = (HttpURLConnection) urlImage.openConnection();
           InputStream inputStream = connection.getInputStream();
           bitmap = BitmapFactory.decodeStream(inputStream);     
           image.setImageBitmap(bitmap);
           } catch (MalformedURLException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }

qui permet vous l'aurez compris de telecharger une image a partir d'une url sur le net.

Mon probleme est qu'a force de telecharger la memoire du tel devient pleine et j'ai ce type d'erreur qui survient :

10-06 20:34:03.614: WARN/dalvikvm(5935): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-06 20:34:03.655: ERROR/AndroidRuntime(5935): FATAL EXCEPTION: main
10-06 20:34:03.655: ERROR/AndroidRuntime(5935): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
10-06 20:34:03.655: ERROR/AndroidRuntime(5935):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-06 20:34:03.655: ERROR/AndroidRuntime(5935):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
10-06 20:34:03.655: ERROR/AndroidRuntime(5935):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:515)

Ce que j'aimerais pouvoir faire, c'est dire que lorsque j'appuie sur la touche retour, je "free" toutes mes images telechargees. Cependant je n'ai pas trouve sur le net de fonction me permettant de liberer ainsi de la memoire ...

Si quelqu'un a une idee a me proposer ou ne serrait-ce qu'une piste, ce serrait genial !

Merci d'avance de votre aide !

EDIT : Il semblerait que je puisse me servir de "public void recycle ()" Mais du coup je me retrouve avec un petit probleme : comment lancer mes recycle lorsque l'on clique sur le bouton retour ??

EDIT : En fait je n'arrive pas a recycler correctement :

je fait quelque chose comme ca :

        @Override
       public boolean onKeyDown(int keyCode, KeyEvent event) 
       {
           if (keyCode == KeyEvent.KEYCODE_BACK) {
                   bitmapp.recycle();
                   if (bitmapp.isRecycled()){
                       Toast.makeText(GameStats.this, "deja recicle", Toast.LENGTH_SHORT).show();    
                   }
                   else{
                       bitmapp.recycle();
                       return super.onKeyDown(keyCode, event);

                   }


           }
           return super.onKeyDown(keyCode, event);

        }

mais l'appli plante lorsque j'essaye de faire retour en me disant :

10-06 22:01:59.435: WARN/dalvikvm(2234): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-06 22:01:59.464: ERROR/AndroidRuntime(2234): FATAL EXCEPTION: main
10-06 22:01:59.464: ERROR/AndroidRuntime(2234): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44003ad8
10-06 22:01:59.464: ERROR/AndroidRuntime(2234):     at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
10-06 22:01:59.464: ERROR/AndroidRuntime(2234):     at android.graphics.Canvas.drawBitmap(Canvas.java:1044)
10-06 22:01:59.464: ERROR/AndroidRuntime(2234):     at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:323)
10-06 22:01:59.464: ERROR/AndroidRuntime(2234):     at android.widget.ImageView.onDraw(ImageView.java:860)

du coup comment puis-je faire pour faire en sorte que mes images qui utilisent le bitmap que j'essaye de recycler ne se servent plus du dit bitmap ??

Par ailleur, est ce normal que l'appli plante apres avoir essaye d'afficher en downloadant une vingtaine d'image .png de 60px/60px ?? [color=red][b]sa[/b][/color] me parrait bien peux pour saturer la memoire ...

EDIT : Finalement je pense avoir trouve la solution en faisant ceci dans mon retour :

Runtime r = Runtime.getRuntime();
               r.gc();

Lien vers le commentaire
Partager sur d’autres sites

Primo : faire tourner le GC ne sert à rien. Il n'y a aucune certitude sur le moment auquel il va passer

Secondo : appeler recycle() n'est pas nécessaire normalement

A mon avis, tu dois conserver une référence sur tes bitmaps. Et c'est la raison pour laquelle tu as une OOMException. Est ce que ce code est utilisé dans le cas d'un ListView ?

Lien vers le commentaire
Partager sur d’autres sites

Non je il est utilise pour afficher des imageView (une vingtaine par page) dans une scrollbare.

Ce qui est etrange c'est que l'utilisation de GC a regle mon probleme .... Comment puis-je faire pour savoir si j'utilise/stocke des references sur mes bitmaps ? Dans eclipse on peut le voir en temps reel ou c'est juste visible dans le code ?

Merci de ton aide !

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...