我有两个简单的活动A
和B
。用户通过按下按钮从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。
答案 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();
}