【问题标题】:Android Gallery crashes because of memory usageAndroid Gallery 因内存使用而崩溃
【发布时间】:2012-02-22 06:16:45
【问题描述】:

在我的应用程序中,我们使用了一个照片库,取自 android dev (http://developer.android.com/resources/tutorials/views/hello-gallery.html)。它从 /sdcard 加载所有照片/DCIM(所有子目录)。虽然我们已经让它重新采样显示的图像以使用更少的内存,但如果用户有很多图片或滚动太快,它仍然会崩溃。

有没有关于如何让图库不让应用崩溃的建议??

(谷歌不应该为我们提供一个“超越自我”的画廊来解决所有这些问题吗?)

【问题讨论】:

    标签: android memory crash gallery image-gallery


    【解决方案1】:

    您是否考虑过使用对所有图像进行软引用的哈希图并在不可用时按需加载它们?当 SD 卡上有大量图像可用时,在内存中存储大量图像是没有意义的。

    private static final ConcurrentHashMap <String, SoftReference<Bitmap>> sBitmapCache =
        new ConcurrentHashMap <String, SoftReference<Bitmap>>();
    
    public static Bitmap getBitmapCache(String imageUrl) {
        SoftReference<Bitmap> reference = sBitmapCache.get(imageUrl);
        Bitmap bitmap = null;
        if(reference != null) {
            bitmap = reference.get();
        } else {
        // get from SD
        }
    
        return bitmap;
    }
    

    哦,另一个编辑:您还可以按比例缩小图像质量,您不需要 20x20 像素大小区域的全质量图像 :)

    【讨论】:

    【解决方案2】:

    标准android画廊的问题是它不会使用视图回收。你可以做任何你想做的缓存图像等。图库本身会将添加到图库中的所有图像视图保存在内存中。这可能会导致快速滚动图库,但也会导致大量内存不足异常。

    一个很好的解决方案是使用Compatibility Library(从 Api Level 4 开始可用)和可以在其中找到的 Viewpager。它将为您提供一个非常可维护的画廊,该画廊更实用(不再跳转图像等),如果您使用FragemtSatePagerAdapter,如果内存紧张,画廊中当前未显示的片段可能会被破坏。

    确保正确实现片段的生命周期。这意味着:

    • 片段需要一个空的构造函数。
    • 将片段数据保存到onSaveInstanceState。在您的情况下,您可能希望保存图像的路径。

    如果您还没有使用片段,那么使用 viewpager 可能看起来需要做很多工作。但这是值得的。之后您和您的用户将拥有一个更好的应用程序。

    【讨论】:

    • 我的应用要求最低 api 7。我可以使用它吗?我没有使用 Fragments,因为该应用是针对手机而不是平板电脑的。
    • 您可以使用兼容性库来使用viewpager。这使得 Viewpager 从 Android 1.6 开始可用。
    猜你喜欢
    • 2013-08-12
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多