您的位置:首页 > 理论基础 > 计算机网络

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

2013-03-31 17:19 1121 查看
最经做网络图片这一部分,前一段时间,运行测试没出现问题,这两天测试出现图片溢出问题,于是找网上资料,查看解决问题,就用了,下面的解决图片大小问题。

测试后,没出现内存溢出问题,转载给自己学习和大家共同学习。

测试环境为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 内存溢出 这一块操作,在实际应用中应该考虑淡定抽取出来。这里为了方便放进来了。 溢出处理实际上就是获得设备分辨率把图片进行压缩。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: