Android加载Bitmap之OOM的解决办法

解决Android中使用Bitmap加载图片发生OOM内存溢出的问题 这两天在写一个上传头像的功能。上传头像到服务器的同时,需要把头像存储在本地。但程序总是运行一段时间后,就因为OOM崩溃了,最终发现问题出在直接使用Bitmap加载图片时,实际上在加载到内存中的时候占用空间的大小远大于图片本身的大小,就容易产生内存溢出的问题。 这个问题困扰了我两天,最后终于解决了,解决办法是对图片进行压缩。因为其实用户头像显示的大小并不大,没有必要使用一张完全高清的图片。决定写下这... 阅读详情

最近遇到一个很闹心的Android开发问题。现在越来越多的应用喜欢用图片代替文字,这个可能也是在这快节奏的时代所必须的产物,图片的生动、传达信息的快速使得在一款App中显示图片尤其重要。但是,在内存有限的移动设备上如何高效的显示图片一直是个另很多开发者蛋疼的问题。

一张100K的jpg格式的图片,在Android中生成Bitmap(位图)时所要占据的空间可能达到500k+。这是为什么呢?特地我问了一位研究图像的研究生:jpg格式的图片本身就对其压缩了,而Bitmap并没有对其压缩,所以两者的大小会有所差距。 好了,不多说了,接下来就是解决多图导致的内存溢出OOM的问题,




import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.support.v4.util.LruCache;

/**
 * @author Warkey.Song
 * @version 创建时间:2014年8月4日 上午10:06:26
 * 类说明
 */

public class ImageDownLoader {
	/**
	 * 缓存Image的类,当存储Image的大小大于LruCache设定的值,系统自动释放内存
	 */
	private LruCache<String, Bitmap> mMemoryCache;
	/**
	 * 操作文件相关类对象的引用
	 */
	private FileUtils fileUtils;
	/**
	 * 下载Image的线程池
	 */
	private ExecutorService mImageThreadPool = null;
	
	
	public ImageDownLoader(Context context){
		//获取系统分配给每个应用程序的最大内存,每个应用系统分配16M
		int maxMemory = (int) Runtime.getRuntime().maxMemory();  
        int mCacheSize = maxMemory / 8;
        //给LruCache分配1/8 4M
		mMemoryCache = new LruCache<String, Bitmap>(mCacheSize){

			//必须重写此方法,来测量Bitmap的大小
			@Override
			protected int sizeOf(String key, Bitmap value) {
				return value.getRowBytes() * value.getHeight();
			}
			
		};
		
		fileUtils = new FileUtils(context);
	}
	
	
	/**
	 * 获取线程池的方法,因为涉及到并发的问题,我们加上同步锁
	 * @return
	 */
	public ExecutorService getThreadPool(){
		if(mImageThreadPool == null){
			synchronized(ExecutorService.class){
				if(mImageThreadPool == null){
					//为了下载图片更加的流畅,我们用了2个线程来下载图片
					mImageThreadPool = Executors.newFixedThreadPool(2);
				}
			}
		}
		
		return mImageThreadPool;
		
	}
	
	/**
	 * 添加Bitmap到内存缓存
	 * @param key
	 * @param bitmap
	 */
	public void addBitmapToMemoryCache(String key, Bitmap bitmap) {  
	    if (getBitmapFromMemCache(key) == null && bitmap != null) {  
	        mMemoryCache.put(key, bitmap);  
	    }  
	}  
	 
	/**
	 * 从内存缓存中获取一个Bitmap
	 * @param key
	 * @return
	 */
	public Bitmap getBitmapFromMemCache(String key) {  
	    return mMemoryCache.get(key);  
	} 
	
	/**
	 * 先从内存缓存中获取Bitmap,如果没有就从SD卡或者手机缓存中获取,SD卡或者手机缓存
	 * 没有就去下载
	 * @param url
	 * @param listener
	 * @param isSave 是否保存到sd卡  true---保存
	 * @return
	 */
	public Bitmap downloadImage(final String url, final onImageLoaderListener listener, final Boolean isSave){
		//替换Url中非字母和非数字的字符,这里比较重要,因为我们用Url作为文件名,比如我们的Url
		//是Http://xiaanming/abc.jpg;用这个作为图片名称,系统会认为xiaanming为一个目录,
		//我们没有创建此目录保存文件就会报错
		if (url != null && !url.equals("")) {
		final String subUrl = url.replaceAll("[^\\w]", "");
		Bitmap bitmap = showCacheBitmap(subUrl);
		if(bitmap != null){
			
			return bitmap;
		} else {

			final Handler handler = new Handler() {
				@Override
				public void handleMessage(Message msg) {
					super.handleMessage(msg);
					listener.onImageLoader((Bitmap) msg.obj, url);
				}
			};

			getThreadPool().execute(new Runnable() {

				@Override
				public void run() {
					Bitmap bitmap = getBitmapFormUrl(url);
					Message msg = handler.obtainMessage();
					msg.obj = bitmap;
					handler.sendMessage(msg);

					try {
						// 保存在SD卡或者手机目录
						if (!isSave) {
							return;
						}
						fileUtils.savaBitmap(subUrl, bitmap);
					} catch (IOException e) {
						e.printStackTrace();
					}

					// 将Bitmap 加入内存缓存
					// addBitmapToMemoryCache(subUrl, bitmap);
				}
			});
		}
		
	}
		return null;
	}
	
	/**
	 * 获取Bitmap, 内存中没有就去手机或者sd卡中获取
	 * @param url
	 * @return
	 */
	public Bitmap showCacheBitmap(String url){
		try {
			if(getBitmapFromMemCache(url) != null){
				return getBitmapFromMemCache(url);
			}else if(fileUtils.isFileExists(url) && fileUtils.getFileSize(url) != 0){
				//从SD卡获取手机里面获取Bitmap
			
				Bitmap bitmap = fileUtils.getBitmap(url);			
				//将Bitmap 加入内存缓存
				//addBitmapToMemoryCache(url, bitmap);
				return bitmap;
			}
			
		} catch(OutOfMemoryError e){
			
		}
		catch (Exception e) {
			// TODO: handle exception
		}
		
		return null;
	}
	
	
	/**
	 * 从Url中获取Bitmap
	 * @param url
	 * @return
	 */
	private Bitmap getBitmapFormUrl(String url) {
		Bitmap bitmap = null;
		HttpURLConnection con = null;
		try {
			BitmapFactory.Options opt = new BitmapFactory.Options();
			opt.inPreferredConfig = Bitmap.Config.RGB_565;
			opt.inPurgeable = true;
			opt.inInputShareable = true; 
                        //对图片进行压缩,这里我将inSampleSize设置为3,这个值可以动态计算的,这里就不介绍了,网上方法忒多
                        //这是从网络获取的图片就是其压缩的图片
                         opt.inSampleSize = 3;
			opt.inJustDecodeBounds = false;
			URL mImageUrl = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) mImageUrl
					.openConnection();
			conn.setDoInput(true);
			conn.connect();
			InputStream is = conn.getInputStream();
                        //没有直接用下面的这个方法解码bitmap而是用decodeSampledBitmapFromResourceMemOpt(is);
                        //bitmap = BitmapFactory.decodeStream(is, null, opt);
			bitmap = decodeSampledBitmapFromResourceMemOpt(is);
			is.close();
		} catch (OutOfMemoryError e) {
          
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (con != null) {
				con.disconnect();
			}
		}
		return bitmap;
	}
	
	/**
	 * 取消正在下载的任务
	 */
	public synchronized void cancelTask() {
		if(mImageThreadPool != null){
			mImageThreadPool.shutdownNow();
			mImageThreadPool = null;
		}
	}
	
	
	/**
	 * 异步下载图片的回调接口
	 * @author len
	 *
	 */
	public interface onImageLoaderListener{
		void onImageLoader(Bitmap bitmap, String url);
	}
	
	/**
	 * 字节生成bitmap
	 * @param inputStream
	 * @return
	 */
	public Bitmap decodeSampledBitmapFromResourceMemOpt(InputStream inputStream) {
		byte[] byteArr = new byte[0];
		byte[] buffer = new byte[1024];
		int len;
		int count = 0;
		try {
			while ((len = inputStream.read(buffer)) > -1) {
				if (len != 0) {
					if (count + len > byteArr.length) {
						byte[] newbuf = new byte[(count + len) * 2];
						System.arraycopy(byteArr, 0, newbuf, 0, count);
						byteArr = newbuf;
					}
					System.arraycopy(buffer, 0, byteArr, count, len);
					count += len;
				}
			}
			final BitmapFactory.Options options = new BitmapFactory.Options();
			options.inSampleSize = 3;
			options.inPurgeable = true;
			options.inInputShareable = true;
			options.inJustDecodeBounds = false;
			options.inPreferredConfig = Bitmap.Config.RGB_565;
			return BitmapFactory.decodeByteArray(byteArr, 0, count, options);

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
}
下面的一个类是对图片的保存

package com.movitech.xcfc.image;

/**
 * @author Warkey.Song
 * @version 创建时间:2014年8月4日 上午10:05:40
 * 类说明
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.EBean.Scope;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;

@EBean(scope = Scope.Singleton)
public class FileUtils {

	/**
	 * sd卡的根目录
	 */
	private static String mSdRootPath = Environment
			.getExternalStorageDirectory().getPath();
	/**
	 * 手机的缓存根目录
	 */
	private static String mDataRootPath = null;
	/**
	 * 保存Image的目录名
	 */
	private final static String FOLDER_NAME = "/AndroidImage";

	public FileUtils(Context context) {

		// mDataRootPath = context.getCacheDir().getPath();
		mDataRootPath = context.getFilesDir().getAbsolutePath();
	}

	/**
	 * 获取储存Image的目录
	 * 
	 * @return
	 */
	private String getStorageDirectory() {
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED) ? mSdRootPath + FOLDER_NAME
				: mDataRootPath + FOLDER_NAME;
	}

	/**
	 * 保存Image的方法,有sd卡存储到sd卡,没有就存储到手机目录
	 * 
	 * @param fileName
	 * @param bitmap
	 * @throws IOException
	 */
	public void savaBitmap(String fileName, Bitmap bitmap) throws IOException {
		if (bitmap == null) {
			return;
		}
		String path = getStorageDirectory();
		File folderFile = new File(path);
		if (!folderFile.exists()) {
			folderFile.mkdir();
		}
		File file = new File(path + File.separator + fileName);
		file.createNewFile();
		FileOutputStream fos = new FileOutputStream(file);
		bitmap.compress(CompressFormat.JPEG, 100, fos);
		fos.flush();
		fos.close();
	}

	/**
	 * 从手机或者sd卡获取Bitmap
	 * 
	 * @param fileName
	 * @return
	 */
	public Bitmap getBitmap(String fileName) {
		String filePath = getStorageDirectory() + File.separator + fileName;
		FileInputStream inputStream;
		File file = new File(filePath);
		Bitmap mBitmap = null;
		try {
			inputStream = new FileInputStream(file);
			// mBitmap = decodeSampledBitmapFromResource(inputStream, 800, 800);
			mBitmap = decodeSampledBitmapFromResourceMemOpt(inputStream);
		/*	return BitmapFactory.decodeFile(getStorageDirectory()
					+ File.separator + fileName);*/
			return mBitmap;
		} catch (Exception e) {

		}
		return mBitmap;
	}

	/**
	 * 判断文件是否存在
	 * 
	 * @param fileName
	 * @return
	 */
	public boolean isFileExists(String fileName) {
		return new File(getStorageDirectory() + File.separator + fileName)
				.exists();
	}

	/**
	 * 获取文件的大小
	 * 
	 * @param fileName
	 * @return
	 */
	public long getFileSize(String fileName) {
		return new File(getStorageDirectory() + File.separator + fileName)
				.length();
	}

	/**
	 * 删除SD卡或者手机的缓存图片和目录
	 */
	public void deleteFile() {
		File dirFile = new File(getStorageDirectory());
		if (!dirFile.exists()) {
			return;
		}
		if (dirFile.isDirectory()) {
			String[] children = dirFile.list();
			for (int i = 0; i < children.length; i++) {
				new File(dirFile, children[i]).delete();
			}
		}

		dirFile.delete();
	}
	
	
	

	
	/**
	 * 字节生成bitmap
	 * @param inputStream
	 * @return
	 */
	public Bitmap decodeSampledBitmapFromResourceMemOpt(FileInputStream inputStream) {

        byte[] byteArr = new byte[0];
        byte[] buffer = new byte[1024];
        int len;
        int count = 0;

        try {
            while ((len = inputStream.read(buffer)) > -1) {
                if (len != 0) {
                    if (count + len > byteArr.length) {
                        byte[] newbuf = new byte[(count + len) * 2];
                        System.arraycopy(byteArr, 0, newbuf, 0, count);
                        byteArr = newbuf;
                    }

                    System.arraycopy(buffer, 0, byteArr, count, len);
                    count += len;
                }
            }

            final BitmapFactory.Options options = new BitmapFactory.Options();
         
            options.inSampleSize = 1;
            options.inPurgeable = true;
            options.inInputShareable = true;
            options.inJustDecodeBounds = false;
            options.inPreferredConfig = Bitmap.Config.RGB_565;
            return BitmapFactory.decodeByteArray(byteArr, 0, count, options);

        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }
	
}
在使用的时候其实很简单,附图一张

基于Multisim的智能交通灯控制系统仿真与实现(含动态闪烁功能) 本文详细介绍了基于Multisim的智能交通灯控制系统仿真与实现,重点解析了动态闪烁功能的电路设计。通过555定时器、74LS192计数器和JK触发器等核心模块,实现了主干道与支干道的交替通行及黄灯1Hz闪烁功能,为交通灯控制系统设计提供了完整的仿真方案。 阅读详情

相关推荐

生信入门第七课:使用FastQC软件进行测序原始fastq数据质控

从实验到数据:RNA定量、文库片段长度、fastqc质控和fastp去接头

微生信 489

Bitmap引起的OOM问题

(内存溢出),我们都知道Android系统会为每个APP分配一个独立的工作空间,或者说分配一个单独的Dalvik虚拟机,这样每个APP都可以独立运行而不相互影响!而Android对于每个Dalvik虚拟机都会有一个最大内存限制,如果当前占用的内存加上我们申请的内存资源超过了这个限制,系统就会抛出OOM错误!另外,这里别和RAM混淆了,即时当前RAM中剩余的内存有1G多,但是OOM还是会发生!别把RAM(物理内存)和OOM扯到一起!另外RAM不足的话,就是杀应用了,而不是仅仅是OOM了!

1 916

新华DCS系统仿真测试方法详细介绍

新华DCS ICAN3.1系统是应用广泛并且功能非常强大的国产DCS系统。具有管理虚拟CPU并仿真运行的功能。并且上位机画面可以与虚拟DPU数据实时同步仿真。具体仿真方法如下所示: 1、 需要设备及软件: 2、步骤如下: 2.1硬件步骤: 1)电脑开机。 2)交换机连接电脑网卡。 3)交换机上电运行。 2.2软件步骤: 1)设置电脑IP 一般配置IP为A网工程站IP。 222.222.221.201/255.255.255.0 2)建立虚拟DPU 登录 D:\iCAN\Program\Vxcu 文件夹。

lw_waston的博客 6893

[Android] Bitmap OOM解决办法

在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,今天在不同型号的三款安卓手机上做了测试,因为有效果也有结果,今天小马就做个详细的总结,以供朋友们共同交流学习,也供自己以后在解决OOM问题上有所提高,提前讲下,片幅有点长,涉及的东西太多,大家耐心看,肯定有收获的,里面的很多东西小马也是学习参考网络资料使用的,先来简单讲下下: ...

weixin_30381793的博客 244

别再只会按按钮了!用NanoStat开源项目学ESP32硬件设计:BOOT与自动下载电路的避坑指南

本文通过NanoStat开源项目深入解析ESP32硬件设计中BOOT与自动下载电路的关键技术。从启动机制、电路设计陷阱到三极管选型,提供了一套完整的避坑指南和优化方案,帮助开发者提升设计可靠性和烧录效率。特别适合中级开发者学习ESP32硬件设计的精髓。

weixin_30296405的博客 439

python -- 海洋气象科研论文中常用绘图配色汇总

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。可以通过自定义选取不同颜色的rgb,通过自定义的方式构建colormap。

weixin_68789096的博客 972

android bitmap oom 最新处理办法,[Android] Bitmap OOM解决办法一

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source...

weixin_31907307的博客 641

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》

本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/

weixin_53751318的博客 1852

android bitmap.createbitmap内存溢出,android bitmap oom 优化

android使用位图显示图片,也就是像素点,jpg之类的压缩格式在android都会转成bitmap。现在手机的分辨率也越来越高,480*800 大小的图片使用的内存大小:480*800*32/8=1536000 =1.5M32表示32位色,每个字节8位。手机上有很多长图大小都是600*10000*32/8=24M,这样一来手机OOM是迟早的事。一些采用缩放和降低画质是解决不了问题的例如下面这两...

weixin_26711801的博客 1934

MTK平台高效部署Qwen2.5大模型:从转换到推理全流程解析

本文详细解析了在MTK平台上高效部署Qwen2.5大模型的全流程,涵盖从环境准备、模型转换与量化,到编译部署与上机推理。重点介绍了如何利用MTK GAI部署工具包进行模型转换和量化,以适配MTK硬件,并最终在设备上成功运行Qwen2.5模型,为边缘侧AI应用提供实践指南。

weixin_29041195的博客 506

为ESXI Host添加v3700 FC存储

物理环境: ESXI Host version 5.1.0 Brocade SAN Switch v3700 Storage 存储和ESXI Host分别用光纤线连接在SAN交换机上 1.查询ESXI Host 的WWN号: 2. SAN交换机上查询存储的WWPN号 SAN交换机: 3.建立zone,添加到cfg文件中 brocade8Gb

haoshuwei531024的专栏 7562

android 解决bitmap造成的OOM问题

前一段时间由于项目中图片过多经常造成内存溢出的问题,现在已经解决。 1通过强引用和弱引用以及LRU算法。 private static final int HARD_CACHE_CAPACITY = 20;//强引用的bitmap的数量 //为了提高图片的利用率,通过单链表实现先进先出,将老的图片移到软引用里面保存 private static LinkedHashMap sHardBit

hahahacff的专栏 1933

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1451

Android 图片加载Bitmap OOM错误解决办法

原文  http://fly-ever.iteye.com/blog/1941986 Android加载资源图片时,很容易出现OOM的错误。  因为Android系统对内存有一个限制,如果超出该限制,就会出现OOM。为了避免这个问题,需要在加载资源时尽量考虑如何节约内存,尽快释放资源等等。  Android系统版本对图片加载,回收的影响:  1,在Android 2.3以及之后,采用的

u010957508的专栏 686

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android 加载bitmap图片 oom 简书_带你走进Android之基础篇--Bitmap加载

嗨,你终于来啦~等你好久啦~从今天开始每天分享一篇Android需要了解的知识点,喜欢的小伙伴欢迎关注,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。昨天贡献一个解压缩zip文件的工具,今天我们来讲讲bitmap加载~Bitmap加载通常来说在加载Bitmap的过程中导致OOM的原因是要加载的图片太大,但因为现在屏幕的尺寸都不...

weixin_29826879的博客 458

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

导致OOM的几种情况

导致OOM 有以下几种情况:1 应用中需要加载大对象,例如Bitmap一张在pc机上用的1024*768图片,如果直接用在手机屏幕这种小屏幕上,不仅没有提高显示质量,还容易使内存吃紧。假设照片是用ARGB_8888格式,那么一张1024×768的图片需要占用3M的内存, 4-5张就OOM了。bitmap分辨率越高,所占用的内存就越大,这个是以2为指数级增长的。解决方案:当我们需要显示大的bitmap

yangxuehui1990的专栏 2962

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2024年安卓最新阿里面试官:简历上最好不要写Glide,不是问源码那么简单(1),2024年最新android 线程面试题

本文通过Glide开题,分析一个图片加载框架必要的需求,以及各个需求涉及到哪些技术和原理。异步加载:最少两个线程池切换到主线程:Handler缓存:LruCache、DiskLruCache,涉及到LinkHashMap原理防止OOM:软引用、LruCache、图片压缩没展开讲、Bitmap像素存储位置源码分析、Fresco部分源码分析内存泄露:注意ImageView的正确引用,生命周期管理列表滑动加载的问题:加载错乱用tag、队满任务存在则不添加。

2401_84520026的博客 432

【Android】安卓常见的内存泄漏:OOM,bitmap

一、关于OOM 1. android图片加载导致的OOM分析及有效解决办法(BitmapUtils) [摘] OOM原因分析 android每一个应用都有一个独立的进程,每个进程都是实例化了dalvik虚拟机实例的linux进程。Dalvik 主要管理的内存有 Java heap 和 native heap 两大块。Android系统对dalvik的vm heapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定),而na

Kindle君的博客 1727

Bitmap与OOM

Bitmap所造成的OOM      图片是一个很耗内存的资源,因此经常会遇到OOM。比如从本地文件中读取图片,然后在GridView中显示出来,如果不做处理,OOM就极有可能发生。 Bitmap引起OOM的原因:  1. 图片使用完成后,没有及时的释放,导致Bitmap占用的内存越来越大,而安卓提供给Bitmap的内存只有8M,   当超出该内存时,自然就发生了OOM  2. 图

CreativeBoy的专栏 1264
上一篇: 固定Textview,字体随着字数的多少字体动态变化大小
下一篇: Android工程:引用另一个Android工程的方法详解
Warkey_Song
博客等级 码龄14年 3粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值