Android:BitmapFactory解码疯狂

时间:2014-08-03 14:07:05

标签: android bitmap

我打算编写一个小图库应用程序。 所以我有一个带有图像的gridview,并且存储了显示的图像 在本地设备上。 我得到的是一个类ImageLoader,它在后台线程(AsyncTask)中加载特定路径中的所有图像,并将它们存储在List位图中,其中ImageItem是一个带有图像和String的pojo类。

Bitmapfactory的解码速度非常慢(600张图像需要10分钟)。 如何改进以下代码以加快加载速度? 也许我只需要解码图像的缩放实例?

private Bitmap getThumbnail(File f, int THUMBNAIL_SIZE) {
    BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
    onlyBoundsOptions.inJustDecodeBounds = true;
    onlyBoundsOptions.inDither = false;                              //optional
    onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;  //optional
    BitmapFactory.decodeFile(f.getAbsolutePath(), onlyBoundsOptions);
    if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) {
        return null;
    }

    int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight :
            onlyBoundsOptions.outWidth;

    double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;

    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
    bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
    bitmapOptions.inDither = false;//optional
    bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional
    return BitmapFactory.decodeFile(f.getAbsolutePath(), bitmapOptions);
}

private static int getPowerOfTwoForSampleRatio(double ratio) {
    int k = Integer.highestOneBit((int) Math.floor(ratio));
    if (k == 0) {
        return 1;
    } else {
        return k;
    }
}

我使用的是缩略图尺寸300。

2 个答案:

答案 0 :(得分:1)

这可能会对你有所帮助。您不应该一次加载所有600张图像。您只应加载当前在网格视图或列表视图中查看的图像或您正在使用的任何图像。

http://www.coderzheaven.com/2013/09/01/faster-loading-images-gridviews-listviews-android-menory-caching-complete-implemenation-sample-code/

答案 1 :(得分:1)

谢谢你,@ BionicSheep为你的目标目标解决方案。 链接上的示例代码将我带到了我想要的东西。 但是,该代码包含一些可疑片段(例如,它永远不会写入缓存中)。但我终于让它顺利工作了。当我完成修复bug时,我会在下面上传修改后的代码。