`

gallery加载大量图片时内存溢出的解决方法(一)

F# 
阅读更多

这只是我以前开始搞android事留下的代码,发现还是存在问题的,我现在把代码放出来,仅供参考,如没有帮助就不要看了,

Gallery加载大量图片的时候容易内存溢出,但是如果及时回收不用的图片,在使用的时候再重新加载,这样就不会出现内存溢出的现象了,所以一定要将加载图片的地址保存起来,在加载图片的时候将生成的bitmap对象用图片地址的字符串保存在map里,不用的时候再根据key值回收。

下面是实现的几个主要部分

1、工具类

public class ImageManager {

static int index = 0;

    public static ConcurrentHashMap<String, Bitmap> imageMap = new ConcurrentHashMap<String, Bitmap>();

    public static String ISFALSE="ISFALSE";

    public static String ISTRUE="ISTRUE";

    public static List<String[]> getSD(String dir) {

        List<String[]> it = new ArrayList<String[]>();

        File f = new File(dir);

        File[] files = f.listFiles();

        if (files != null) {

            for (int i = 0; i < files.length; i++) {

                String[] s = new String[2];

                File file = files[i];

 

                if (file.isFile()) {

                    if (getImageFile(file.getPath())) {

                        System.out.println("file   " + String.valueOf(file));

                        s[0] = file.getPath();

                        s[1] = file.getName();

                        it.add(s);

                    }

                } else if(file.isDirectory()){

                    System.out.println("file.isDirectory()   " + file.getAbsolutePath());

                    getSD(String.valueOf(file.getAbsolutePath()));

                }

            }

        }

        return it;

    }

    public static boolean getImageFile(String fName) {

        boolean re;

        String end = fName

                .substring(fName.lastIndexOf(".") + 1, fName.length())

                .toLowerCase();

        if (end.equals("jpg") || end.equals("gif") || end.equals("png")

                || end.equals("jpeg") || end.equals("bmp")) {

            re = true;

        } else {

            re = false;

        }

        return re;

    }

    public static Bitmap getImage(String fileName) {

        try {

            File file = new File(fileName);

            Bitmap bitmap = null;

            bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

            addImage(fileName, bitmap);

            return bitmap;

        } catch (Exception e) {

            return null;

        }

    }

    public static Bitmap getRefImage(String fileName) {

        try {

            File file = new File(fileName);

            Bitmap bitmap = null;

            bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

            addImage(fileName, bitmap);

            return createReflectionImageWithOrigin(fileName, bitmap);

        } catch (Exception e) {

            return null;

        }

    }

    public static void addImage(String uri, Bitmap bitmap) {

        imageMap.put(uri.toString(), bitmap);

    }

    private static void clearBitmap(String uri) {

        if (imageMap.get(uri) != null) {

            System.out.println("remove image:" + uri);

            imageMap.get(uri).recycle();

            imageMap.remove(uri);

        }

    }

    // 清空左边到0、右边到最后,保留中间

    public static List<ImageMessage> clearImage(List<ImageMessage> imageList,

            int start, int end) {

        if (start >= 0 && end < imageList.size()) {

            for (int i = 0; i < start; i++) {

                if (imageList.get(i).getIsNull().equals(ISFALSE)) {

                    imageList.get(i).setIsNull(ISTRUE);

                    clearBitmap(imageList.get(i).getPath().toString());

                    clearBitmap(imageList.get(i).getPath().toString() + "1");

                    clearBitmap(imageList.get(i).getPath().toString() + "2");

                    imageList.get(i).setImage(null);

                }

            }

            for (int i = end + 1; i < imageList.size(); i++) {

                if (imageList.get(i).getIsNull().equals(ISFALSE)) {

                    imageList.get(i).setIsNull(ISTRUE);

                    clearBitmap(imageList.get(i).getPath().toString());

                    clearBitmap(imageList.get(i).getPath().toString() + "1");

                    clearBitmap(imageList.get(i).getPath().toString() + "2");

                    imageList.get(i).setImage(null);

                }

            }

        }

        return imageList;

    }

    // 获得带倒影的图片方法

    public static Bitmap createReflectionImageWithOrigin(String str,

            Bitmap bitmap) {

        final int reflectionGap = 0;//原图片与倒影图片之间的缝隙

        int width = bitmap.getWidth();

        int height = bitmap.getHeight();

        Matrix matrix = new Matrix();

        matrix.preScale(1, -1);

        Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,

                width, height / 2, matrix, false);

        addImage(str + "1", reflectionImage);

        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,

                (height + height / 2), Config.ARGB_8888);

        addImage(str + "2", bitmapWithReflection);

        Canvas canvas = new Canvas(bitmapWithReflection);

        canvas.drawBitmap(bitmap, 0, 0, null);

        Paint deafalutPaint = new Paint();

        canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);

        canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

  

分享到:
评论
4 楼 Mr.Cheney 2012-09-17  
代码太乱了
3 楼 heguikun 2011-11-25  
这个想法跟我的一样,我困扰好几天,实在没办法了,好像也没有更好的办法了,这样做我觉得是唯一的办法,楼主英明,500长图片啊,不这样做 没有其他可言了
2 楼 muyu114 2011-09-26  
你这个方法不错,但是代码怎么有点乱啊,能给个完整的么xiaofeng_8041@126.com
1 楼 ckarying 2011-07-09  
你好,这份代码能不能给我发一个demo,我有急用,谢谢了,我的email是ckarying@gmail.com

相关推荐

    针对Android应用中Gallery内存溢出的解决方案.pdf

    在Android应用中,Gallery(画廊)组件被广泛用于展示和浏览图片,但由于图片文件通常较大,特别是高清图片,当用户需要浏览大量图片时,容易导致内存溢出,严重影响用户体验和应用稳定性。 #### Android应用架构与...

    gallery加载大图片可以更换sd卡路径不溢出有倒影效果

    在Android开发中,"gallery加载大图片可以更换sd卡路径不溢出有倒影效果"这一主题涉及到几个关键知识点:图片加载优化、内存管理、SD卡存储以及倒影效果的实现。下面将逐一进行详细解释。 1. 图片加载优化: 当...

    Android应用源码 Gallery实现异步加载网络图片 并只加载当前停止页面图.zip

    只加载当前停止页面的图片是一种有效的策略,可以避免一次性加载过多图片导致内存溢出。这可能通过监听Gallery的滚动事件并在需要时加载图片来实现。 4. **图片缓存**:为提升性能和用户体验,网络图片通常会被缓存...

    Android应用源码 Gallery实现异步加载网络图片

    在Android开发中,图片加载是一个常见的需求,尤其是在创建一个类似画廊(Gallery)的应用时,用户通常希望可以滚动浏览大量的网络图片。`Android应用源码 Gallery实现异步加载网络图片`是一个典型的问题,它涉及到...

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip

    然而,直接加载网络图片到Gallery中会带来性能问题,因为这可能导致大量的网络请求,消耗大量内存,并可能造成应用卡顿。为了解决这个问题,我们需要异步加载图片,即在后台线程下载图片,然后在UI线程更新显示,以...

    【计算机专业-Andorid项目源码100套之】android Gallery实现异步加载网络图片 并只加载当前停止页面图

    5. **图片处理**:在加载网络图片时,可能需要根据设备屏幕尺寸和Gallery的大小进行适当的缩放,以避免加载过大图片导致内存溢出。 6. **图片占位符**:在图片真正加载之前,可以显示一个占位符,如一个加载动画或...

    安卓Android源码——Gallery实现异步加载网络图片 并只加载当前停止页面图.zip

    在Gallery中,关键在于处理好滚动时的图片加载逻辑,防止内存溢出。 4. **只加载当前停止页面图**: 这种策略被称为懒加载(Lazy Loading),它意味着只有当图片所在的页面进入可视区域时才开始加载。这样可以显著...

    android Gallery 3d 图片浏览 oom

    在Android开发中,"android Gallery 3d 图片浏览 oom"是一个常见的问题,尤其是在处理大量图片时。oom,全称是Out Of Memory,即内存溢出错误,当应用程序分配的内存超过系统能提供的范围时,就会触发这个错误。本文...

    大量图片优化

    在Android开发中,处理大量图片时常常会遇到内存溢出(Out of Memory)的问题,...通过以上策略,可以有效解决Android应用在加载大量图片时可能出现的内存溢出问题,同时优化虚拟机内存使用,提升应用的稳定性和性能。

    Gallery从SD卡中获取图片,并显示.rar

    使用`decodeFile()`方法可以从文件路径加载图片,然后可以通过` BitmapFactory.Options`控制内存使用,避免内存溢出。 3. **自定义Gallery视图**:Android原生的`Gallery`组件在Android 3.0(API级别11)之后已被弃...

    安卓Gallery照片墙画廊图库相关-DragToSortImage相册加载和图片拖拽.rar

    比如,使用LruCache或其他内存缓存策略,避免一次性加载所有图片导致内存溢出;使用低分辨率的缩略图减少内存占用;并确保在图片不再需要时正确释放资源。 9. **用户界面设计** 良好的拖放体验需要直观的视觉反馈...

    安卓Gallery照片墙画廊图库相关-异步加载图库中的图片.rar

    4. **图片压缩**:加载大图可能导致内存溢出,因此需要在加载前对图片进行压缩处理,控制其占用的内存大小。 5. **占位符和错误图**:在图片加载过程中显示占位符,加载失败时显示错误图,提供良好的用户体验。 6....

    Android--从系统Camera和Gallery获取图片优化

    在Android开发中,获取并处理图片是一项常见的任务,但如果不进行优化,可能会导致内存溢出、性能下降等问题。本文将详细探讨如何优化从系统Camera和Gallery获取图片的过程,以提高应用的性能和用户体验。 首先,...

    android gallery图片轮播

    4. ** Glide / Picasso / Fresco**:这些是流行的图片加载库,可以帮助开发者高效地加载和缓存网络或本地的图片,避免内存溢出并优化性能。在图片轮播中,它们可以无缝集成到ViewPager中,实现动态加载和显示图片。 ...

    Android图片异步加载大全

    在Android应用开发中,图片加载是一项关键且技术性较强的任务,尤其在处理大量图片或大尺寸图片时,如何实现高效、流畅的异步加载显得尤为重要。"Android图片异步加载大全"这个项目提供了多种场景下图片加载的示例,...

    C# Android Gallery-Dome 图片滑动效果显示

    这些库可以缓存图片,避免内存溢出,同时支持异步加载和占位符,提高用户体验。 5. **Adapter与数据绑定**: 图片滑动效果通常与Adapter结合使用,如PagerAdapter或RecyclerView.Adapter。Adapter负责将数据集(如...

    大图片所引起的内存问题

    这种方法结合了引用管理和图片处理,有效解决了因大图片导致的内存溢出问题。 总之,Android开发者在处理大图片时,必须注意内存的合理使用,避免内存泄露和溢出。通过优化图片加载策略、管理Bitmap引用以及适当地...

Global site tag (gtag.js) - Google Analytics