Android 异步获取网络图片并处理图片Out Of Memory 内存溢出问题
测试环境为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;@Overrideprotected Bitmap doInBackground(Object... params) {// TODO Auto-generated method stubBitmap 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);//endopts.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.测试调用代码:
@Overridepublic 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);//endImageView 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 内存溢出 这一块操作,在实际应用中应该考虑淡定抽取出来。这里为了方便放进来了。 溢出处理实际上就是获得设备分辨率把图片进行压缩。
转载于:https://www.cnblogs.com/yeqw1985/archive/2013/02/06/2908190.html
Android 异步获取网络图片并处理图片Out Of Memory 内存溢出问题相关推荐
- python requests 异步调用_python - 如何使用requests_html异步获取()URL列表? - 堆栈内存溢出...
我正在尝试使用python包resuqests_html异步获取()URL列表,类似于使用Python 3.6.5和request_html 0.10.0 的README中的异步示例 . 我的理解是, ...
- Android中获取网络图片的三种方法
android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用 ...
- Android异步下载网络图片(其二:AsyncTask)
在上一节中,我们使用Handler.Thread/Runnable .URL.HttpURLConnection等等来进行异步下载网络图片. 但是采用这种方式有一些缺点,如下: 线程的开销较大,如果每 ...
- Android异步下载网络图片(其三:ExecutorService)
在第一节中,我们使用Handler.Thread/Runnable .URL.HttpURLConnection等等来进行异步下载网络图片.然后第二节中换了AsyncTask方式.那么这一节我们再应用 ...
- 【Android】获取当前的app中cpu和内存的百分比 -调研报告
背景 项目要求获取当前app运行时的cpu和内存状况. 调研 CPU获取 Android实现获取当前的app的cpu实时使用情况的代码 以下是获取当前app的CPU实时使用情况的代码(Java): p ...
- android内存溢出错误,Android Studio 生成 JavaDoc 空指针异常|文档编码出错|内存溢出...
一般使用Android Studio生成 JavaDoc会有三个问题: 1.空指针异常 Tools --> Generate JavaDoc -->打开对话框活,在"Other ...
- android asyc异步获取网络图片为bitmap,异步之AsyncTask(一)
插图.png 导读 在Android中每一个应用都拥有自己的独立进程,而一个进程可以拥有多个线程,在这些线程中有一个线程叫做MainThread(也叫UIThread).它负责显示.更新UI,与用户交 ...
- Android ListView异步获取网络图片
今天做项目的时候,导师要求我在Listview做加载图片采用异步加载的方式. 我就上网找了一个例子学习了一下. 我贴一个地址,大家可以去学习一下. ListView异步加载网络图片完美版之双缓存技术 ...
- Android异步下载网络图片(其一:Handler)
项目中有时候需要获取网络上的图片,并下载下来到手机客户端显示.怎么做呢? 实现思路是: 1:在UI线程中启动一个线程,让这个线程去下载图片. 2:图片完成下载后发送一个消息去通知UI线程 2:UI线程 ...
最新文章
- 双显卡单独分辨率_CPU、GPU双重碾压!AMD RX 6000系列显卡正式发布 16G显存吊锤RTX 30...
- R语言dplyr包pull函数抽取dataframe数据列实战
- POJ 1035, Spell checker
- [学习笔记] css中的line-height
- 图片鉴黄大赛上线,请开始你的表演
- scikit-learn学习笔记
- Swift 周报 第十期
- excel查找空值快捷键_Excel快捷键查询
- USB 3.0 高清音视频采集芯片——MS2130
- excel宏 批量生成返回目录
- 企业微信审批功能有哪些?审批人如何设置?
- rocketdock 打不开 有进程
- 2022第四届中国(山东)国际大健康产业博览会,即将开幕
- 关于LyfUpload 错误 #x27;80020009#x27; 下标越界的错误,还请大侠们帮帮忙!!!
- TS+vue3 页面红色波浪线(和声明类型有关)
- 用JavaScript判断一个数是否是素数
- MVTec AD—A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection 2019 CVPR
- [2019长沙长郡中学集训]加法
- Android Studio Chipmunk | 2021.2.1 Patch 2(2022 年 8 月)
- 小程序SetTimeOut的一个坑