在OnDestroy中回收位图 - '尝试使用回收的位图#39;重新启动活动时

时间:2011-11-24 22:37:58

标签: android

我有两个简单的活动AB。用户通过按下按钮从B启动A,然后用户通过按后退按钮返回A

onDestroy()活动方法B中,我回收了活动B中使用的一些背景图片。我想要了解的是,当活动B再次启动时,我正在“尝试使用循环位图”。当然位图将在onCreate()方法中再次加载?就像他们必须在活动第一次启动时一样。

这是我的示例代码:

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();
     }
 }

我用于从B

启动活动A的代码
     Intent intent = new Intent(ActivityA.this, ActivityB.class);
     startActivity(intent);

selectionpage.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>                

这部分可能是相关的。我不确定。我注意到在启动活动B之后,即使它已经被销毁,我仍然可以在使用MAT分析内存堆时看到我的活动实例。 GC根的路径似乎通过Java.lang.Thread和ContextImpl。

3 个答案:

答案 0 :(得分:2)

您收到该错误是因为ImageView iv&amp; LinearLayout ll仍然指向回收的位图。您不需要在onDestroy()内自行回收。当系统不需要位图时,它们将被释放。

答案 1 :(得分:1)

如果您在一个单独的线程中引用了活动,并且保留活动的时间超过应有的时间,则可能会发生内存泄漏。

这可能导致旧活动中的iv和ll在被回收后仍然使用位图。您可以执行iv.setImageDrawable(null)和ll.setBackgroundDrawable(null),但这些位图是由系统创建的,您不需要回收它们。

我猜你正在尝试回收它们,因为你遇到了内存问题?通过可能的上述泄漏可以更好地解释。

答案 2 :(得分:-1)

您必须在代码中执行此操作。 在代码中启动Bitmap对象并使用Imageview.setImageBitmap(位图)

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();
 }