`

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

相关推荐

    冒险岛群聊机器人 蠢猫(无视计算 星之力计算 世界组队表 占卜 怪物查询).zip

    无人机最强算法源码,易于部署和学习交流使用

    node-v8.14.1-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    HostelDataset(been personally processed)

    此数据集主要是一个跟酒店类型有关的数据集,源于kaggle网站上的Guatemalas_Travel数据集,因设计所需,本人对原来的数据集进行了必要的修改。

    3D相册.zip

    3D相册.zip

    中国统计NJ面板数据-(更新至2022年)平均每天能源消费量.xls

    数据来源:中国统计NJ-2023版

    3dmax空对象清除器下载

    3dmax空对象清除器,在场景中找到空对象,向你显示这些对象的列表,并允许你从场景中删除它们。

    node-v10.13.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    中国统计NJ面板数据-(更新至2022年)入境外国游客分组构成.xls

    数据来源:中国统计NJ-2023版

    数据要素资产化与数据资产入表路线框架总体规划方案.pptx

    数据要素资产化与数据资产入表路线框架总体规划方案.pptx

    用户手册 8100C/8200C/8300C系列无功补偿装置

    施耐德电气 8100C 8200C 8300C 用户手册

    毫无特色的 QQ 机器人.zip

    无人机最强算法源码,易于部署和学习交流使用

    员工培训方案gl.ppt

    员工培训方案gl.ppt

    infrared-remote-controller-master

    旅行商问题

    小米扫地机器人工程源码程序STM32103 freeRTOS设计源代码.zip

    小米扫地机器人工程源码程序STM32103 freeRTOS设计源代码,某米早起的扫地机器人的源码,使用的是STM32开发,freeRTOS系统,包含完整的工程源码,可以做为你的学习设计参考。 HARDWARE文件夹 硬件初始化源文件 application_Robot 机器人行为相关的文件 application_Share 机器人共享相关的文件(一般为算法) application_Motor 机器人电机应用相关文件 application_Key 机器人按键应用相关文件 application_Led 机器人LED应用相关文件 application_Led 机器人adc获取与处理应用相关文件 application_PowerChip 机器人电池管理芯片与充电应用相关文件 application_Bmi160 机器人BMI160 陀螺仪芯片 应用相关文件 application_Drop 机器人掉落传感器应用相关文件 application_UltraSonic 机器人超声波传感器应用相关文件 appl

    39黎秋菊.ipynb

    39黎秋菊.ipynb

    node-v11.14.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    域名注册查询的微信小程序页面源码

    模板描述:域名注册查询 微信小程序。域名注册查询的微信小程序页面源码是使用微信WEB开发者工具开发,亲测可直接运行。该程序从设计上满足了相关应用服务的设计要求,是一款非常值得学习简介的DEMO小程序源码。

    水下机器人无线充电上位机.zip

    无人机最强算法源码,易于部署和学习交流使用

    DCS 400系列可控硅直流传动系统手册

    DCS 400 手册

    node-v11.15.0-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics