如何在没有de /分配内存的情况下使用ImageView

时间:2012-09-17 19:42:12

标签: android eclipse android-4.0-ice-cream-sandwich

我有一个应用程序,它使用带有数千张图像的翻书式动画。 APK尺寸不是问题,因为它是一个永远不会放在任何应用商店的内部唯一应用程序。

我遇到的问题是我的动画师是一个子类 ImageView ,以每秒15帧的速度切换图像,每次调用 setImageURI 垃圾收集然后运行。那么 setImageURI 还有另一种不会导致垃圾收集运行的方法吗?

编辑:更多背景信息。

我的应用程序有~12个序列,其中6个包含1609个图像,需要在某些帧调用不同的事件。另一个需要是用户能够在任何帧上停下来调查情况并且执行动作或继续按顺序执行。 3D引擎本来是理想的解决方案,但这种方法是在用户不需要完全自由的情况下提出的,并且在整个时间内处于“轨道”状态。

这是应用程序的主要部分,也是问题发生的地方

try {
   ((BitmapDrawable) getDrawable()).getBitmap().recycle();
   setImageURI(imgUri);
   refreshDrawableState();
} catch (Exception e) {
   e.printStackTrace();
}

2 个答案:

答案 0 :(得分:1)

垃圾收集器正在运行,因为您正在将一个映像交换为转储前一个映像的另一个映像。每次丢失对图像的引用时都会发生这种情况。

以下是一些可能需要考虑的方法。

  1. 由于您提到它是一本翻书,所以构建并为ImageView分配一个AnimationDrawable,它将作为逐帧动画(恰好是一本翻书)。这会立即加载所有图片,并会保留它们,直到您丢失对AnimationDrawable的引用。

  2. 将所有图像存储为SoftReferences以缓存图像。 SoftReference会将对象保留在内存中,直到需要收集内存为止。这将减慢垃圾收集器的频率(假设这是原因)。使用BitmapFractory构建图片,使用setImageBitmap将其分配给ImageView。这样做的另一个好处是它允许您在将线程分配给ImageView之前在线程上构建图像。

答案 1 :(得分:0)

也许是因为你的Image需要大量内存,并且android需要调用GB以释放更多mem以避免崩溃你的程序