Android 异步获取网络图片并处理导致内存溢出问题解决方法

测试环境为Adnroid 2.1以上。

1.AndroidManifest.xml 权限配置:

添加互联网访问权限:

复制代码 代码如下:

<uses-permission android:name="android.permission.INTERNET" />

2.异步图片类 ImageDownloadTask

复制代码 代码如下:

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.MalformedURLException;

import java.net.URL;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.AsyncTask;

import android.widget.ImageView;

public class ImageDownloadTask extends AsyncTask<Object, Object, Bitmap> {

private ImageView imageView = null;

/***

* 这里获取到手机的分辨率大小

* */

public void setDisplayWidth(int width) {

_displaywidth = width;

}

public int getDisplayWidth() {

return _displaywidth;

}

public void setDisplayHeight(int height) {

_displayheight = height;

}

public int getDisplayHeight() {

return _displayheight;

}

public int getDisplayPixels() {

return _displaypixels;

}

private int _displaywidth = 480;

private int _displayheight = 800;

private int _displaypixels = _displaywidth * _displayheight;

@Override

protected Bitmap doInBackground(Object... params) {

// TODO Auto-generated method stub

Bitmap bmp = null;

imageView = (ImageView) params[1];

try {

String url = (String) params[0];

bmp = getBitmap(url, _displaypixels,true);

} catch (Exception e) {

return null;

}

return bmp;

}

protected void onPostExecute(Bitmap result) {

if (imageView != null&&result!=null) {

imageView.setImageBitmap(result);

if (null != result && result.isRecycled() == false)

System.gc();

}

}

/**

* 通过URL获得网上图片。如:http://www.xxxxxx.com/xx.jpg

* */

public Bitmap getBitmap(String url, int displaypixels, Boolean isBig) throws MalformedURLException, IOException {

Bitmap bmp = null;

BitmapFactory.Options opts = new BitmapFactory.Options();

InputStream stream = new URL(url).openStream();

byte[] bytes = getBytes(stream);

//这3句是处理图片溢出的begin( 如果不需要处理溢出直接 opts.inSampleSize=1;)

opts.inJustDecodeBounds = true;

BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);

opts.inSampleSize = computeSampleSize(opts, -1, displaypixels);

//end

opts.inJustDecodeBounds = false;

bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);

return bmp;

}

/**

* 数据流转成btyle[]数组

* */

private byte[] getBytes(InputStream is) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] b = new byte[2048];

int len = 0;

try {

while ((len = is.read(b, 0, 2048)) != -1) {

baos.write(b, 0, len);

baos.flush();

}

} catch (IOException e) {

e.printStackTrace();

}

byte[] bytes = baos.toByteArray();

return bytes;

}

/****

* 处理图片bitmap size exceeds VM budget (Out Of Memory 内存溢出)

*/

private int computeSampleSize(BitmapFactory.Options options,

int minSideLength, int maxNumOfPixels) {

int initialSize = computeInitialSampleSize(options, minSideLength,

maxNumOfPixels);

int roundedSize;

if (initialSize <= 8) {

roundedSize = 1;

while (roundedSize < initialSize) {

roundedSize <<= 1;

}

} else {

roundedSize = (initialSize + 7) / 8 * 8;

}

return roundedSize;

}

private int computeInitialSampleSize(BitmapFactory.Options options,

int minSideLength, int maxNumOfPixels) {

double w = options.outWidth;

double h = options.outHeight;

int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math

.sqrt(w * h / maxNumOfPixels));

int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(

Math.floor(w / minSideLength), Math.floor(h / minSideLength));

if (upperBound < lowerBound) {

return lowerBound;

}

if ((maxNumOfPixels == -1) && (minSideLength == -1)) {

return 1;

} else if (minSideLength == -1) {

return lowerBound;

} else {

return upperBound;

}

}

}

3.测试调用代码:

复制代码 代码如下:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

ImageDownloadTask imgtask =new ImageDownloadTask();

/**这里是获取手机屏幕的分辨率用来处理 图片 溢出问题的。begin*/

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

imgtask.setDisplayWidth(dm.widthPixels);

imgtask.setDisplayHeight(dm.heightPixels);

//end

ImageView imageView_test= (ImageView)findViewById(R.id.imageView_test);

imgtask.execute("http://pic.qukantu.com/big/7515/201201031116491.jpg",imageView_test);

}

4.小结:

主要是通过 extends AsyncTask<Object, Object, Bitmap> 来实现异步的。

图片Out Of Memory 内存溢出 这一块操作,在实际应用中应该考虑淡定抽取出来。这里为了方便放进来了。 溢出处理实际上就是获得设备分辨率把图片进行压缩。

时间: 2024-10-17 23:13:03

Android 异步获取网络图片并处理导致内存溢出问题解决方法的相关文章

Android加载图片内存溢出问题解决方法

  这篇文章主要介绍了Android加载图片内存溢出问题解决方法,本文讲解使用BitmapFactory.Options解决内存溢出问题,需要的朋友可以参考下 1. 在Android软件开发过程中,图片处理是经常遇到的. 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API提供了BitmapFactory.Options这个类. 2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bi

Android加载图片内存溢出问题解决方法_Android

1. 在Android软件开发过程中,图片处理是经常遇到的. 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API提供了BitmapFactory.Options这个类. 2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用BitmapFact

压缩-android展示多张大图导致内存溢出问题

问题描述 android展示多张大图导致内存溢出问题 现在在开发一个联系人头像展示功能,每一屏页面大概展示72张图片,已做了异步加载,但是由于图片太大了,依然会导致内存溢出,请问有没有什么好的不会导致图片变模糊并且执行效率比较高的压缩方法,或者请问有没有其他好的解决方法? 解决方案 Android 内存溢出问题android从Uri得到Bitmap内存溢出问题Android使用bitmap导致内存溢出(oom)问题 解决方案二: 你的图片是头像,那么肯定显示的比较小,你在网络读取图片的时候,执行

关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看

问题描述 关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看 之前一段时间使用一段时间老是导致内存升高,而且内存也不回收,一步一步的排除了很多地方, 到最后发现问题是出在adapter中,但是也不知道怎么改了. 大神帮看看哪些地方会导致内存泄露! public void setmList(List mList) { if (isgroup) { isDiaplayNickName = SharePreferenceUtil.get_Boolean

android异步获取图片并且本地存储的后续问题

问题描述 android异步获取图片并且本地存储的后续问题 我已经实现了头像图片的异步加载以及头像图片的下载及本地保存.实现方法及源代码请见我的博文:图片的异步加载及图片本地缓存 现在出现了一个后续的问题由于是头像,所以我使用了用户的ID作为头像的名称,例如现在我有3个好友分别是user1,user2,user3,以及我自己myUser.那么第一次读取过后我本地的头像就为user1.jpguser2.jpguser3.jpgmyUser.jpg.好了问题来了,当我的好友们的头像发生变化的时候,我

WPF循环加载图片导致内存溢出如何解决

程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成"动画". 生成BitmapImage的方法有多种: 1.var source=new BitmapImage(new Uri("图片路径",UriKind.xxx)); 一般的场景使用这种方法还是比较方便快捷,但是对于本场景,内存恐怕得爆.2. var data =File.ReadAllBytes("图片路径"); var ms = new System.IO.MemoryStrea

viewpager加载多张大图导致内存溢出

问题描述 viewpager加载多张大图导致内存溢出 同样的app程序,在原生Android系统上就不出现内存溢出,在华为系统上就会出现内存溢出的情况, viewpager 加载多个布局,每个布局里面都有一张大图,实现了类似于图片游览器的功能. 里面有写回收图片操作和压缩为原图一半的操作

不停的用simpleadapter加载更新gridview导致内存溢出,怎么解决

问题描述 不停的用simpleadapter加载更新gridview导致内存溢出,怎么解决 public class Myragment extends Fragment { private GridView grid; ArrayList> arraylist = null; int[] temp = new int[] {R.id.cell}; String[] temp1 = new String[] { "cell" }; MyHandler handler = new

Android编程获取SD卡路径及剩余容量的方法_Android

本文实例讲述了Android编程获取SD卡路径及剩余容量的方法.分享给大家供大家参考,具体如下: public static String getExternalStoragePath() { // 获取SdCard状态 String state = android.os.Environment.getExternalStorageState(); // 判断SdCard是否存在并且是可用的 if (android.os.Environment.MEDIA_MOUNTED.equals(stat