Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在不取消/分配内存的情况下使用ImageView_Android_Eclipse_Android 4.0 Ice Cream Sandwich - Fatal编程技术网

Android 如何在不取消/分配内存的情况下使用ImageView

Android 如何在不取消/分配内存的情况下使用ImageView,android,eclipse,android-4.0-ice-cream-sandwich,Android,Eclipse,Android 4.0 Ice Cream Sandwich,我有一个应用程序,它使用翻页书样式的动画和数千幅图像。APK大小不是一个问题,因为它是一个内部唯一的应用程序,永远不会放在任何应用商店 我遇到的问题是,我的动画师是一个子类的ImageView,它以每秒15帧的速度切换图像,每次调用setImageURI垃圾收集都会运行。那么,除了setImageURI之外,还有其他方法不会导致运行垃圾收集吗 编辑:多一点背景信息 我的应用程序有12个序列,其中6个包含1609个图像,需要在特定帧调用不同的事件。另一个需求是用户能够在任何帧上停止以调查情况,或者

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

我遇到的问题是,我的动画师是一个子类的ImageView,它以每秒15帧的速度切换图像,每次调用setImageURI垃圾收集都会运行。那么,除了setImageURI之外,还有其他方法不会导致运行垃圾收集吗

编辑:多一点背景信息

我的应用程序有12个序列,其中6个包含1609个图像,需要在特定帧调用不同的事件。另一个需求是用户能够在任何帧上停止以调查情况,或者执行一个动作,或者继续序列。3D引擎本来是理想的解决方案,但这种方法的提出是因为用户不需要完全的自由,而且整个时间都在“轨道”上

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

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

可能是因为你的图像需要太多内存,android需要调用GB来释放更多内存,以避免程序崩溃

可能是因为你的图像需要太多内存,android需要调用GB来释放更多内存,以避免程序崩溃。

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

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

  • 既然您提到它是一本“动画书”,请构建并为
    图像视图
    指定一个,该视图将充当逐帧动画(与“动画书”完全相同)。这将一次加载所有图像,并将它们保留在周围,直到您丢失对
    AnimationDrawable
    的引用

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


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

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

  • 既然您提到它是一本“动画书”,请构建并为
    图像视图
    指定一个,该视图将充当逐帧动画(与“动画书”完全相同)。这将一次加载所有图像,并将它们保留在周围,直到您丢失对
    AnimationDrawable
    的引用

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


  • 更改图像时,不需要对位图调用recycle。ImageView为您提供了这一功能。但问题是一样的。您正在丢失对位图的引用,因此需要运行GC来收集它。防止这种情况发生的唯一方法是将对位图的引用保留在ImageView之外,并在用户没有注意到的情况下有时间收集位图时取消分配。@DeeV-将它们保留在内存中是一个问题,因为我的~130mb JPG每个扩展到2.7mb。在这个速度下,约190帧或13秒将消耗比设备上ram更多的内存。然后,您会遇到一个矛盾的问题,因为您需要内存才能继续,但除非取消分配,否则无法获得内存,但每次取消分配位图时,GC都会运行。GC将在决定运行时运行。您对它何时运行的控制有限。SoftReference建议仅在需要内存时释放内存,而不是仅在GC决定该释放内存时释放内存,从而缓解了这种情况。你可以在C++环境中分配位图,绕过JVM,不计入你的配额。不过,您仍然受到硬件的限制。更改图像时,不需要调用位图上的循环。ImageView为您提供了这一功能。但问题是一样的。您正在丢失对位图的引用,因此需要运行GC来收集它。防止这种情况发生的唯一方法是将对位图的引用保留在ImageView之外,并在用户没有注意到的情况下有时间收集位图时取消分配。@DeeV-将它们保留在内存中是一个问题,因为我的~130mb JPG每个扩展到2.7mb。在这个速度下,约190帧或13秒将消耗比设备上ram更多的内存。然后,您会遇到一个矛盾的问题,因为您需要内存才能继续,但除非取消分配,否则无法获得内存,但每次取消分配位图时,GC都会运行。GC将在决定运行时运行。您对它何时运行的控制有限。SoftReference建议仅在需要内存时释放内存,而不是仅在GC决定该释放内存时释放内存,从而缓解了这种情况。你可以在C++环境中分配位图,绕过JVM,不计入你的配额。不过,您仍然受到硬件的限制。方法#2对我来说是“最好”的解决方案,因为对于我的停止/开始/从帧num x开始/恢复需要,简单的翻页书有点有限。安卓最终没有为我所说的工作