`

OOM解决

 
阅读更多
http://www.cdtarena.com/gpx/201210/5883.html
http://blog.csdn.net/a859522265/article/details/8012871
转一份,方便查阅,防止失效

大家好,今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候
就要用BitmapFactory.Options这个东东了,Options里主要有两个参数比较重要.
[java] view plaincopyprint?
options.inJustDecodeBounds = false/true;
//图片压缩比例.
options.inSampleSize = ssize;
我们去解析一个图片,如果太大,就会OOM,我们可以设置压缩比例inSampleSize,但是这个压缩比例设置多少就是个问题,所以我们解析图片可以分为俩个步骤,第一步就是
获取图片的宽高,这里要设置Options.inJustDecodeBounds=true,这时候decode的bitmap为null,只是把图片的宽高放在Options里,然后第二步就是设置合适的压缩比例inSampleSize,这时候获得合适的Bitmap.这里我画了简单的流程图,如下:【成都IT培训】


为了让大家更容易理解,我这里做了一个简单的demo,主要功能就是一个界面里有个ImageView,点击ImageView的时候,进入本地相册,选择一个图片的时候,ImageView控件显示选择的图片。Demo的步骤如下:
第一步新建一个Android工程命名为ImageCacheDemo.目录结构如下:

第二步新建一个ImageCacheUtil.java工具类,代码如下:

package com.tutor.oom;
import java.io.InputStream;
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
/**
* @author frankiewei.
* 工具类.
*/
public class ImageCacheUtil {
/**
* 获取合适的Bitmap平时获取Bitmap就用这个方法吧.
* @param path 路径.
* @param data byte[]数组.
* @param context 上下文
* @param uri uri
* @param target 模板宽或者高的大小.
* @param width 是否是宽度
* @return
*/
public static Bitmap getResizedBitmap(String path, byte[] data,
Context context,Uri uri, int target, boolean width) {
Options options = null;
if (target > 0) {
Options info = new Options();
//这里设置true的时候,decode时候Bitmap返回的为空,
//将图片宽高读取放在Options里.
info.inJustDecodeBounds = false;
decode(path, data, context,uri, info);
int dim = info.outWidth;
if (!width)
dim = Math.max(dim, info.outHeight);
int ssize = sampleSize(dim, target);
options = new Options();
options.inSampleSize = ssize;
}
Bitmap bm = null;
try {
bm = decode(path, data, context,uri, options);
} catch(Exception e){
e.printStackTrace();
}
return bm;
}
/**
* 解析Bitmap的公用方法.
* @param path
* @param data
* @param context
* @param uri
* @param options
* @return
*/
public static Bitmap decode(String path, byte[] data, Context context,
Uri uri, BitmapFactory.Options options) {
Bitmap result = null;
if (path != null) {
result = BitmapFactory.decodeFile(path, options);
} else if (data != null) {
result = BitmapFactory.decodeByteArray(data, 0, data.length,
options);
} else if (uri != null) {
//uri不为空的时候context也不要为空.
ContentResolver cr = context.getContentResolver();
InputStream inputStream = null;
try {
inputStream = cr.openInputStream(uri);
result = BitmapFactory.decodeStream(inputStream, null, options);
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
/**
* 获取合适的sampleSize.
* 这里就简单实现都是2的倍数啦.
* @param width
* @param target
* @return
*/
private static int sampleSize(int width, int target){
int result = 1;
for(int i = 0; i < 10; i++){
if(width < target * 2){
break;
}
width = width / 2;
result = result * 2;
}
return result;
}
}

第三步:修改ImageCacheDemoActivity.java代码如下:

package com.tutor.oom;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
/**
* @author frankiewei.
* 解决图片普通OOM的Demo.
*/
public class ImageCacheDemoActivity extends Activity {
/**
* 显示图片的ImageView.
*/
private ImageView mImageView;
/**
* 打开本地相册的requestcode.
*/
public static final int OPEN_PHOTO_REQUESTCODE = 0x1;
/**
* 图片的target大小.
*/
private static final int target = 400;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
private void setupViews(){
mImageView = (ImageView)findViewById(R.id.imageview);
mImageView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
openPhotos();
}
});
}
/**
* 打开本地相册.
*/
private void openPhotos() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, OPEN_PHOTO_REQUESTCODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case OPEN_PHOTO_REQUESTCODE:
if(resultCode == RESULT_OK){
//如果用这个方法,Options为null时候,就是默认decode会出现oom哦.
//Bitmap bm = ImageCacheUtil.decode(null, null,
// ImageCacheDemoActivity.this, data.getData(), null);
//这里调用这个方法就不会oom.屌丝们就用这个方法吧.
Bitmap bm = ImageCacheUtil.getResizedBitmap(null, null,
ImageCacheDemoActivity.this, data.getData(), target, false);
mImageView.setImageBitmap(bm);
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}

其中main.xml布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<ImageView
android:id="@+id/imageview"
android:layout_width="400px"
android:layout_height="400px"
android:src="@drawable/ic_launcher"
/>
</LinearLayout>

第四步运行上述工程,效果如下:

从本地相册选择显示。用了getRsizedBitmap()方法,图片很大不会oom.

运用默认的decode方法就会oom。
OK,今天就讲到这里,大家有什么疑问的,可以留言,谢谢大家!!!
分享到:
评论

相关推荐

    博客资源:ViewPager加载大量图片oom解决方案demo

    "博客资源:ViewPager加载大量图片oom解决方案demo" 这个标题表明了这是一个关于解决在Android应用中使用ViewPager展示大量图片时出现内存溢出(Out Of Memory,简称OOM)问题的实例教程。ViewPager是Android SDK中...

    Android Web3j OOM解决详解

    在Android客户端使用Web3j创建钱包、导入钱包时都可能会产生OOM,相关issue在Github上已经有所提及: ...创建钱包OOM解决 在创建钱包时,如果创建一个Full Wallet,则会导致OOM:

    图片异步加载插件,完美oom解决内存溢出

    "图片异步加载插件"正是一款为解决这个问题而设计的工具,它能够有效地优化内存管理,提高用户体验。这款插件的名字是Android-Universal-Image-Loader,其主要功能和特性包括: 1. **异步加载**:Android-Universal...

    WalletOOM:适用于Android客户端的Web3j OOM解决方案

    Android Web3j OOM解决在Android客户端使用Web3j创建钱包、导入钱包时都可能会产生OOM,相关issue在Github上已经有所提及: 。这个问题在Web3j 3.0版本以前是没有的,由于新版的Web3j使用spongycastle库替换了...

    bitmap OOM的解决方案

    解决Bitmap OOM问题的方法多种多样: 1. **适当缩放**:在加载图片时,先计算出适合屏幕大小的尺寸,然后对图片进行等比例缩放。这样可以显著减少内存占用。可以使用`BitmapFactory.Options`的`inSampleSize`参数来...

    图片oom,解决方法

    以下将详细探讨图片OOM的问题以及解决方法。 1. **问题分析**: - **图片加载机制**:Android系统在加载图片时,会将图片解码为Bitmap对象,而Bitmap占用的内存与图片的宽度、高度和颜色深度有关。高分辨率图片在...

    教你分析9种OOM常见原因及解决方案.docx

    OOM 9种常见原因及解决方案 以下是OOM 9种常见原因及解决方案的知识点: 1. Java Heap Space 错误 * 原因分析:请求创建一个超大对象、超出预期的访问量/数据量、过度使用终结器、内存泄漏 * 解决方案:通过 -Xmx...

    android 图片内存溢出(OOM)解决

    基本上解决了OOM问题 如果 方便可以直接引用BitmapManager类到 项目中使用 解决blog 地址http://www.cnblogs.com/liongname/articles/2345087.html

    详解Android_性能优化之ViewPager加载成百上千高清大图oom解决方案

    本文将深入探讨如何解决`ViewPager`加载成百上千高清大图导致的OOM问题。 首先,我们需要理解`OOM`产生的原因。当应用程序在内存中分配的内存超过系统所能提供的限制时,就会触发`OOM`。在Android中,每个应用都有...

    Groovy大量计算导致oom的解决办法

    问题原因分析:使用ScriptEngine.eval每次都会对脚本进行编译,生成一个新的类,被GroovyClassLoader加载,大量执行计算后,将导致被加载的类数量不断增加,最终OOM。 解决办法:对计算的表达式expression进行预...

    加载图片oom的解决

    为了解决这个问题,我们需要掌握一些有效的策略来优化图片加载,防止OOM的发生。以下是一些关键知识点: 1. **图片大小与分辨率**:理解图片的像素大小和分辨率至关重要。高分辨率的图片会占用更多内存,因此,尽量...

    Android加载大图片OOM异常解决

    Android 加载大图片 OOM 异常解决方案 在 Android 开发中,加载大图片是一个常见的问题,这可能会引发 OOM(Out of Memory)异常。OOM 异常是指应用程序试图分配超过系统可用内存的内存空间,从而导致应用程序崩溃...

    解决帧动画OOM问题

    本文将深入探讨如何解决帧动画引发的OOM问题,以及如何确保动画流畅运行。 首先,理解帧动画的工作原理至关重要。在Android中,帧动画是通过`AnimationDrawable`类实现的,它将一系列的图片资源(如PNG或JPEG格式)...

    安卓gif加载解决oom

    本篇将详细介绍如何解决Android中加载GIF导致的OOM问题。 首先,理解Android内存管理机制是解决问题的关键。Android系统为每个应用分配一定的内存预算,当应用超过这个预算时,就会抛出OOM异常。对于大内存消耗的...

    GridView解决OOM

    综上所述,解决GridView中的OOM问题主要依赖于有效的内存管理和图片加载策略。通过使用LruCache进行图片缓存,配合合适的图片尺寸调整,以及合理的多图下载策略,可以显著减少内存消耗,提高应用性能,从而避免出现...

    Spark面对OOM问题的解决方法及优化总结1

    本篇文章主要探讨Spark面对OOM问题的解决方法及优化策略。 首先,我们需要了解Spark的内存模型。Spark的Executor内存分为三个部分:Execution内存、Storage内存和其他内存。Execution内存主要用于执行任务,如join...

    MySQL OOM(内存溢出)的解决思路

    OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...

    Keras 快速解决OOM超内存的问题

    在运行几次循环之后,就会报错OOM。 解决方法是在每个代码后面接clear_session()函数,显示的关闭TFGraph,再重启。 详情参考 https://keras.io/backend/#backend-functions。 from keras import backend as K K....

    自定义相册实现多选照片解决oom

    本文将详细探讨如何通过自定义相册来实现多选照片功能,并针对OOM问题提出解决方案。 首先,自定义相册的实现通常需要以下几个关键步骤: 1. **获取系统相册中的图片**:可以使用ContentResolver查询MediaStore中...

Global site tag (gtag.js) - Google Analytics