5 votes

recylage des bitmaps dans OnDestroy - "tentative d'utilisation d'un bitmap recyclé" lors du relancement de l'activité

J'ai deux activités simples A y B . L'utilisateur commence B de A en appuyant sur un bouton, et l'utilisateur revient alors à A en appuyant sur le bouton retour.

Dans le onDestroy() méthode d'activité B Je recycle certaines images de fond utilisées dans l'activité B . Ce que j'essaie de comprendre, c'est pourquoi, lorsque l'activité B est redémarré, je reçois le message "trying to use a recycled bitmap". Les bitmaps seront certainement rechargés dans la méthode onCreate(), comme ils ont dû l'être lors du premier lancement de l'activité.

Voici mon exemple de code :

public class ActivityB extends Activity {

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
         setContentView(R.layout.selectionpage);    
     }  

     @Override
     public void onDestroy() {      
        ImageView iv = (ImageView) findViewById(R.id.imageView1);
        ((BitmapDrawable)iv.getDrawable()).getBitmap().recycle();
        LinearLayout ll = (LinearLayout) findViewById(R.id.linearLayout1);
        ((BitmapDrawable)ll.getBackground()).getBitmap().recycle();
        super.onDestroy();
     }
 }

Le code que j'utilise pour lancer l'activité B de A

     Intent intent = new Intent(ActivityA.this, ActivityB.class);
     startActivity(intent);

page de sélection.XML :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/backgroundimage">

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/selectionimage"/>
        </LinearLayout>                

Cette partie peut être pertinente. Je ne suis pas sûr. J'ai remarqué qu'après avoir lancé l'activité B, même après sa destruction, je peux encore voir une instance de mon activité lorsque j'analyse le tas de mémoire à l'aide de MAT. Le chemin vers les racines du GC semble passer par Java.lang.Thread et ContextImpl.

2voto

Caner Points 15625

Vous obtenez cette erreur parce que ImageView iv & LinearLayout ll pointent toujours vers des bitmaps recyclés. Vous n'avez pas besoin de faire le recyclage vous-même à l'intérieur de onDestroy() . Les bitmaps seront libérés lorsqu'ils ne seront plus utilisés par le système.

1voto

FunkTheMonk Points 6639

Vous pouvez avoir une fuite de mémoire si vous avez une référence à l'activité dans un thread séparé qui conserve l'activité plus longtemps que prévu.

Cela pourrait faire en sorte que iv et ll de l'ancienne activité utilisent toujours les bitmaps après qu'ils aient été recyclés. Vous pourriez faire iv.setImageDrawable(null) et ll.setBackgroundDrawable(null), mais ces bitmaps sont créés par le système et vous ne devriez pas avoir besoin de les recycler.

Je suppose que vous essayez de les recycler parce que vous avez rencontré des problèmes de mémoire ? ce qui s'expliquerait mieux par l'éventuelle fuite mentionnée ci-dessus.

-1voto

nhanhk6153 Points 1

Vous devez le faire en code. Initiez l'objet Bitmap dans le code et utilisez Imageview.setImageBitmap(bitmap).

Bitmap bitmap;
@Override
public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.selectionpage);   
     bitmap = new BitmapFactory.decode...
     yourImageView.setImageBitmap(bitmap);

 }  
 @Override
 public void onDestroy() {      

    super.onDestroy();
    // do recycle bitmap here
    bitmap.recycle();
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X