【问题标题】:Free resources when leaving activity离开活动时的免费资源
【发布时间】:2013-12-02 05:19:35
【问题描述】:
我想知道在 android 中离开活动时是否可以释放资源?
我的应用程序有几个活动,其中一个非常消耗内存,因为它包含许多高质量的图像。如果一个人去这个活动堆飙升,它离切线的内存不足异常不远。假设它占据了 85% 的限制。但是 - 这是几个活动之一,也是唯一一个消耗内存的活动。其他的不是 - 它唯一的列表视图包含一些文本。
我并不是说我有内存泄漏,但为了安全起见,我想在离开这个保存图像的活动时释放资源。我不知道该怎么做?
谢谢!!!
【问题讨论】:
标签:
android
android-activity
【解决方案2】:
当系统不再使用您的资源时,垃圾收集器应自动清除它们,但是您可以强制执行此操作,如以下答案所示:
https://stackoverflow.com/a/7009362/1222050
ImageView imageView = (ImageView)findViewById(R.id.my_image);
Drawable drawable = imageView.getDrawable();
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
bitmap.recycle();
}
此外,如果您要填充那么多内存,我建议您考虑缩小位图的大小。你可以这样做:
Bitmap b = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(b, 120, 120, false));
我的一个问题是您如何开始应用程序的下一个活动/部分?
【解决方案3】:
Drawable 比 Bitmap 更广泛。 Drawable 旨在表示图形系统可以呈现给显示器的任何内容。 Drawable 的子类(例如 ShapeDrawable 或 ColorDrawable)不包含位图,因此不需要任何类型的手动内存管理。
BitmapDrawable 包装 Bitmap 并包含对 Bitmap 的引用。 Bitmap 很特殊,因为 Android 将所有 Bitmap 的像素数据保存在一个单独的堆中,该堆与应用程序的其余部分分开管理。当 Android 垃圾收集器清理 Bitmap 对象时,它也会清理位图堆中的像素数据。但是您可以通过手动调用 Bitmap 上的 recycle() 来强制它更快发生,这会将 Bitmap 标记为无效并释放其像素数据。
Android 会为每个正在运行的应用程序分配一个固定大小的位图堆,您的应用程序可能会因为一次使用太多位图而耗尽其堆。这就是为什么如果您的应用程序广泛使用位图,一旦您知道不再需要位图,您可能会从回收位图中受益。
更新:单独的位图堆适用于 Honeycomb 之前的 Android 版本。从 Honeycomb 开始,位图堆与应用程序堆合并。