Android从SD卡加载大量图片

Android平台SD卡图片读取实战教程 在Android平台上,外部存储通常指的是设备上用于存储应用程序数据的非易失性存储介质。这可以是内部的SD卡或外部的USB驱动器,甚至是网络存储空间。外部存储可以被应用程序用来存储大量数据,比如图片、音乐文件、视频等。Android提供了API来帮助开发者访问和管理外部存储上的文件和目录。Android权限体系是用于保护用户数据和系统安全的机制。它主要分为系统权限和应用权限。系统权限通常由系统应用或拥有root权限的应用使用,而应用权限则面向普通应用开发者。 阅读详情
package com.exam.gallery;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.support.v4.util.LruCache;
import android.widget.ImageView;

/**
 * 从SDCard异步加载图片
 *
 * @author hanj 2013-8-22 19:25:46
 */
public class SDCardImageLoader {
    //缓存
    private LruCache<String, Bitmap> imageCache;
    // 固定2个线程来执行任务
    private ExecutorService executorService = Executors.newFixedThreadPool(2);
    private Handler handler = new Handler();

    private int screenW, screenH;

    public SDCardImageLoader(int screenW, int screenH) {
        this.screenW = screenW;
        this.screenH = screenH;

        // 获取应用程序最大可用内存
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 8;

        // 设置图片缓存大小为程序最大可用内存的1/8
        imageCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes() * value.getHeight();
            }
        };
    }

    private Bitmap loadDrawable(final int smallRate, final String filePath,
                                final ImageCallback callback) {
        // 如果缓存过就从缓存中取出数据
        if (imageCache.get(filePath) != null) {
            return imageCache.get(filePath);
        }

        // 如果缓存没有则读取SD卡
        executorService.submit(new Runnable() {
            public void run() {
                try {
                    BitmapFactory.Options opt = new BitmapFactory.Options();
                    opt.inJustDecodeBounds = true;
                    BitmapFactory.decodeFile(filePath, opt);

                    // 获取到这个图片的原始宽度和高度
                    int picWidth = opt.outWidth;
                    int picHeight = opt.outHeight;

                    //读取图片失败时直接返回
                    if (picWidth == 0 || picHeight == 0) {
                        return;
                    }

                    //初始压缩比例
                    opt.inSampleSize = smallRate;
                    // 根据屏的大小和图片大小计算出缩放比例
                    if (picWidth > picHeight) {
                        if (picWidth > screenW)
                            opt.inSampleSize *= picWidth / screenW;
                    } else {
                        if (picHeight > screenH)
                            opt.inSampleSize *= picHeight / screenH;
                    }

                    //这次再真正地生成一个有像素的,经过缩放了的bitmap
                    opt.inJustDecodeBounds = false;
                    final Bitmap bmp = BitmapFactory.decodeFile(filePath, opt);
                    //存入map
                    imageCache.put(filePath, bmp);

                    handler.post(new Runnable() {
                        public void run() {
                            callback.imageLoaded(bmp);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        return null;
    }

    /**
     * 异步读取SD卡图片,并按指定的比例进行压缩(最大不超过屏幕像素数)
     *
     * @param smallRate 压缩比例,不压缩时输入1,此时将按屏幕像素数进行输出
     * @param filePath  图片在SD卡的全路径
     * @param imageView 组件
     */
    public void loadImage(int smallRate, final String filePath, final ImageView imageView) {

        Bitmap bmp = loadDrawable(smallRate, filePath, new ImageCallback() {

            @Override
            public void imageLoaded(Bitmap bmp) {
                if (imageView.getTag().equals(filePath)) {
                    if (bmp != null) {
                        imageView.setImageBitmap(bmp);
                    } else {
                        imageView.setImageResource(0);
                    }
                }
            }
        });

        if (bmp != null) {
            if (imageView.getTag().equals(filePath)) {
                imageView.setImageBitmap(bmp);
            }
        } else {
            imageView.setImageResource(0);
        }

    }


    // 对外界开放的回调接口
    public interface ImageCallback {
        // 注意 此方法是用来设置目标对象的图像资源
        public void imageLoaded(Bitmap imageDrawable);
    }
}

用法:

String path=list.get(position);
holder.img.setTag(path);
imageLoader.loadImage(2, path, holder.img);


Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南 本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。 阅读详情

相关推荐

常见的AXI总线仲裁器概述-AXI协议理解(一)

SoC 设计广泛采用共享总线式的片上通信,其中的仲裁器是共享总线的关键技术之一。AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。

Paul 安的博客 1万+

android控件ImageView加载sdcard卡,网络及res中的图片

提前声明 加载网络资源需要网络访问权限: 加载sd卡中的资源则需要权限: 不然,  不然 , 代码正确,但一直会抛异常哟  因为没权限呀 没权限 效果图: 一: 先说访问res/drawable/下的图片的访问方法中,因为这种最简单,getResources()是Context的方法。 myPic.setImageDrawabl

sky_0035的专栏 2864

temu登录接口逆向分析(含Py纯算)

【代码】temu登录接口逆向分析(含Py纯算)

数据精灵喵 1944

android sp存储图片,Android 读取sdcard上的图片实例(必看)

Android读取sdcard上的图片是非常简单的事情,下面用一个例子来说明这个问题。首先,在sdcard上有一张已经准备好的img25.jpg下面,需要做的是把这张图片读取到app中显示。做到如下的效果:1、首先你要在AndroidManifest.xml申请读取sdcard的权限,加入一条语句之后,AndroidManifest.xml如下:package="com.sdcardread"an...

weixin_35761503的博客 597

iOS WKWebView H5微信支付跳转

iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: 了解WKWebView基本初始化及使用 了解如何利用URL Schemes进行应用间跳转 公司或个人已经在微信后台注册了一级域名 GitHub地址(附代码) :iOS WKWebView H5微信支付跳转 简书地址 :iOS WKWebView H5微信支付跳转 博客地址 :iOS WKWe...

ForeverMyheart的博客 2046

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.csdn.net/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2845

【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示

尽管以下的app还没有做到快图浏览、ES文件浏览器的水平,遇到大sdcard还是会存在读取过久、内存溢出等问题,可是基本思想是这种。 例如以下图。在sdcard卡上有4张图片, 打开app,则会吧sd卡上的全部图片读取,并显示出来。读取的过程有进度条显示。 制作步骤例如以下: 1、首先,res\values\strings.xml对字符设置例如以下,没有什么特别的。...

weixin_33943347的博客 317

视频帧插学习(三):ema-vfi代码拆解和分析

video interp EMA-VFI

mikhailbran的博客 708

【C语言趣味教程】(0) 专栏介绍

这是一套C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出"有趣的干货" !本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录!标题前带星号 (*) 的部分不建议初学者阅读,因为内容难免会超出当前章节的知识点,面向的是对 C 语言有一定基础或已经学过

有道无术, 术尚可求。有术无道, 止于术。 2万+

YOLO26优化:特征融合 | 一种新颖的多尺度特征融合iAFF,适配小目标检测

在YOLO26中如何使用:iAFF加入Neck替代Concat;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 268

android使用ImageView加载本地SdCard图片和加载网络图片

android使用ImageView加载本地SdCard图片和加载网络图片   例子1:android加载自己文件夹的图片,使用R类   main.xml文件     android:orientation="vertical"     android:layout_width="fill_parent"     android:layout_hei

huang9012的专栏 1万+

华为OD机试 - TLV格式(Python/JS/C/C++ 2025 C卷 100分)

两端通过TLV格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成。第二行:需要匹配的tag数量n(0 < n < 1000)后面N行:需要匹配n个tag值(十进制表示),递增排列。标签10(0A)存在,长度3,valueOffset=2。标签15(0F)长度4,valueOffset=2。标签14(0E)长度2,valueOffset=8。

学Java,找哪吒 2038

android之图片异步加载并缓存到本地

  在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载。图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓...

既是过河之卒,惟有奋力向前。 225

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android开源框架之Android-Universal-Image-Loader

引言:图片加载在Android开发中几乎是每一个应用都有的需求。图片加载从大的角度可以分为两种,一种是加载一两张的少量图片,比如用户资料页面加载一个用户头像图片;另一种则是加载大量网络图片,比如朋友圈,比如今日头条等新闻类APP的新闻页。对于第一种情况,我们一般开个线程或者用AsynTask异步加载一下就完事了,但对于第二种如果每张图片的加载都手动new 一个thread去做,逻辑操作复杂和内存泄漏都

小莫(Alan_Mo)的博客 1097

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

GridView异步加载本地图片缩略图

main.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical

shouliang52000的专栏 9078

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android_开源框架_AndroidUniversalImageLoader网络图片加载

1.功能概要  Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。 (1).使用多线程加载图片 (2).灵活配置ImageLoader的基本参数,包括线程数、缓存方式、图片显示选项等; (3).图片异步加载缓存机制,包括内存缓存及SDCard缓存; (4).采用监听器监听

一路向前 493

异步图片加载工具类

package com.su.doubanrise.widget; import java.io.File; import java.lang.ref.SoftReference; import java.util.HashMap; import android.content.Context; import android.graphics.Bitmap; import an...

weixin_34336292的博客 102

ListView 中如何优化图片?

图片的优化策略比较多。1、处理图片的方式:如果 ListView 中自定义的 Item 中有涉及到大量图片的,一定要对图片进行细心的处理,因为图片占的内存是ListView 项中最头疼的,处理图片的方法大致有以下几种:①、不要直接拿路径就去循环 BitmapFactory.decodeFile;使用 Options 保存图片大小、不要加载图片到内存去。②、对图片一定要经过边界压缩尤其是比较大的图片...

weixin_30791095的博客 189

Android开发 ListView,Gallery,GridView等图片性能优化

ListView,Gallery,GridView等控件,在载入大量图片时,很容易会产生OutOfMemoryError异常,即内存溢出.因为每个应用可用内存是有限的,但是图片却很占内存,JPG,PNG本身就是压缩格式,如果分辨率高,很可能保存到磁盘中只有几百K,但是读到内存中会占用十几M内存.图片一多,自然就OutOfMemoryError了.解决这个问题,需要考虑两个方面...

weixin_34059951的博客 85

android 自动剪裁图片,android使用系统裁剪图片

android系统自带的有裁剪图片功能,在应用过程中,碰到了诸多问题,在些做个记录:代码如下,注释很详细,记得加写入sd卡数据的权限public class MainActivity extends Activity {private static final int TAKE_BIG_PICTURE = 100;private static final int TAKE_SMALL_PICTUR...

weixin_30069591的博客 794

彻底解决Android因加载多个大图引起的OutOfMemoryError,内存溢出的问题

http://blog.csdn.net/wulianghuan/article/details/11548373?reload 最近因为项目里需求是选择或者拍摄多张照片后,提供滑动预览和上传,很多照片是好几MB一张,因为目前的Android系统对运行的程序都有一定的内存限制,一般是16MB或24MB(视平台而定),不做处理直接加载的话必然会报OOM (Out Of Memmory)。网上...

weixin_30278311的博客 109

Android 内存泄漏和OOM分析(二)

OOM 内存泄漏 处理方法

永远不要停下学习的脚步。 5974

Universal-Image-Loader

首先下载jar包到项目libs文件夹下   Image-Loader.jar   从个人在项目使用中看,该开源库十分适用于RecyclerView等部件的adapter中(需要显示很多图片),当item复用时加快图片的加载。 个人观点,还请批评指出问题。   1.基本用法 Uri uris = Uri.prase("..."); //uris支持的类型 "http://site.co

C_J_X的博客 645

Universal-Image-Loader 使用

项目介绍:Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。特性列举:多线程下载图片,图片可以来源于网络,文件系统,

luohai859的专栏 596

Android - weight,patch图片,shape图形,震撼发布

1.android:layout_weight:权重比例,将剩余空间按比例分配。只可在线性布局中使用 2.指定android:layout_weight属性后, 如果线性布局是水平的,View的宽度=原有宽度+线性布局剩余空间的占比 如果线性布局是竖直的,View的高度=原有高度+线性布局剩余空间的占比 3.Android官方推荐,在使用android:layout_weight时, 如果线性布局是水平的,要将android:layout_width设置为0dp 如果线性布局是竖直的,要将android:l

m0_64319298的博客 161
上一篇: Java反射学习笔记
下一篇: Android高效获取指定类型文件,获取文件不求人!
冒泡彩虹
博客等级 码龄14年 17粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值