1

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

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

编辑:更多背景信息。

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

这是应用程序的核心,也是出现问题的地方

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

2 回答 2

1

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

这里有几种可能的方法可供考虑。

  1. 既然您提到它是一本动画书,那么构建并分配一个AnimationDrawableImageView将充当逐帧动画(正是动画书的本质)。这会一次加载所有图像并将它们保留在您丢失对AnimationDrawable.

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

于 2012-09-17T19:58:00.353 回答
0

也许是因为你的 Image 需要很多内存,而 android 需要调用 GB 来释放更多的内存,以避免你的程序崩溃

于 2012-09-17T19:52:12.797 回答