Android: BitmapFactory解码速度慢得要命



我打算编写一个小的图库应用程序。我有一个带有图像的gridview,显示的图像是存储的在本地设备上。我得到的是一个类ImageLoader,在后台线程(AsyncTask)的特定路径中加载所有图像,并将它们存储在列表位图中,其中ImageItem是一个带有图像和字符串的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。

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

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

感谢@BionicSheep为您提供针对性的解决方案。链接上的示例代码给我带来了我正在寻找的东西。然而,该代码包含一些可疑的部分(例如,它从未将任何内容写入缓存)。但我终于让它顺利运行了。当我完成修复错误时,我将在下面上传修改后的代码。

最新更新