如何解决bitmap 内存溢出out of memory解决的问题

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&Android 异步获取网络图片并处理导致内存溢出问题解决方法
字体:[ ] 类型:转载 时间:
Android异步获取网络图片并处理图片Out Of Memory内存溢出如何解决呢?本文介绍了操作步骤,感兴趣的朋友可以了解下或许对你有所帮助
测试环境为Adnroid 2.1以上。 1.AndroidManifest.xml 权限配置: 添加互联网访问权限:
代码如下: &uses-permission android:name="android.permission.INTERNET" /&
2.异步图片类 ImageDownloadTask
代码如下: import java.io.ByteArrayOutputS import java.io.IOE import java.io.InputS import java.net.MalformedURLE import java.net.URL; import android.graphics.B import android.graphics.BitmapF import android.os.AsyncT import android.widget.ImageV public class ImageDownloadTask extends AsyncTask&Object, Object, Bitmap& { private ImageView imageView = /*** * 这里获取到手机的分辨率大小 * */ public void setDisplayWidth(int width) { _displaywidth = } public int getDisplayWidth() { return _ } public void setDisplayHeight(int height) { _displayheight = } public int getDisplayHeight() { return _ } public int getDisplayPixels() { return _ } private int _displaywidth = 480; private int _displayheight = 800; private int _displaypixels = _displaywidth * _ @Override protected Bitmap doInBackground(Object... params) { // TODO Auto-generated method stub Bitmap bmp = imageView = (ImageView) params[1]; try { String url = (String) params[0]; bmp = getBitmap(url, _displaypixels,true); } catch (Exception e) {
} protected void onPostExecute(Bitmap result) { if (imageView != null&&result!=null) { imageView.setImageBitmap(result); if (null != result && result.isRecycled() == false) System.gc(); } } /** * 通过URL获得网上图片。如:/xx.jpg * */ public Bitmap getBitmap(String url, int displaypixels, Boolean isBig) throws MalformedURLException, IOException { Bitmap bmp = BitmapFactory.Options opts = new BitmapFactory.Options(); InputStream stream = new URL(url).openStream(); byte[] bytes = getBytes(stream); //这3句是处理图片溢出的begin( 如果不需要处理溢出直接 opts.inSampleSize=1;) opts.inJustDecodeBounds = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); opts.inSampleSize = computeSampleSize(opts, -1, displaypixels); //end opts.inJustDecodeBounds = bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);
} /** * 数据流转成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();
} /**** * 处理图片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 roundedS if (initialSize &= 8) { roundedSize = 1; while (roundedSize & initialSize) { roundedSize &&= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedS } private int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outW double h = options.outH 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 lowerB } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerB } else { return upperB } } }
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("/big/.jpg",imageView_test); }
4.小结: 主要是通过 extends AsyncTask&Object, Object, Bitmap& 来实现异步的。 图片Out Of Memory 内存溢出 这一块操作,在实际应用中应该考虑淡定抽取出来。这里为了方便放进来了。 溢出处理实际上就是获得设备分辨率把图片进行压缩。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Android有效解决加载大图片时内存溢出的问题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
Android有效解决加载大图片时内存溢出的问题
上传于||文档简介
&&A&#8203;n&#8203;d&#8203;r&#8203;o&#8203;i&#8203;d&#8203;有&#8203;效&#8203;解&#8203;决&#8203;加&#8203;载&#8203;大&#8203;图&#8203;片&#8203;时&#8203;内&#8203;存&#8203;溢&#8203;出&#8203;的&#8203;问&#8203;题
大小:7.84KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢推荐这篇日记的豆列
······}

我要回帖

更多关于 bitmaputils 内存溢出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信