Morgan26 Posté(e) 6 octobre 2010 Share Posté(e) 6 octobre 2010 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 More sharing options...
Cyril Mottier Posté(e) 7 octobre 2010 Share Posté(e) 7 octobre 2010 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 More sharing options...
Morgan26 Posté(e) 7 octobre 2010 Auteur Share Posté(e) 7 octobre 2010 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 More sharing options...
Cyril Mottier Posté(e) 7 octobre 2010 Share Posté(e) 7 octobre 2010 Tu es certain que tes images ne font que 60x60px ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Morgan26 Posté(e) 7 octobre 2010 Auteur Share Posté(e) 7 octobre 2010 Sure et certain Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.