android 加载图片防止内存溢出
图片资源:
private int fore[];
private int back[];
fore = new int[]{R.drawable.a0, R.drawable.a1, R.drawable.a2,
R.drawable.a3, R.drawable.a4, R.drawable.a5,
R.drawable.a6, R.drawable.a7, R.drawable.a8,
R.drawable.a9, R.drawable.a910, R.drawable.a911,
R.drawable.a912, R.drawable.a913, R.drawable.a914};
back = new int[]{R.drawable.b0, R.drawable.b1, R.drawable.b2,
R.drawable.b3, R.drawable.b4, R.drawable.b5,
R.drawable.b6, R.drawable.b7, R.drawable.b8,
R.drawable.b9, R.drawable.b910, R.drawable.b911,
R.drawable.b912, R.drawable.b913, R.drawable.b914};
//用户保存加载的图片
private List<Bitmap> bitmapResource = new ArrayList<BitMap>();
GridView grid;//声明 图片显示 类似九宫格 的 控件
Handler handler; //声明 Handler 用来传递消息
计算方法:
int width = (int) (getWindowManager().getDefaultDisplay().getWidth()/density);//取得屏幕的宽度
ImageResource ir = new ImageResource();
//使用getPicture()方法 加载图片
public void getPicture(){
new AsyncTask<Object, Object, Object>() {// 进度条类 异步处理
@Override
protected Object doInBackground(Object... params) {//后台执行,比较耗时的操作都可以放在这里。
publishProgress();//来更新任务的进度。
loadingBitmap(getResources(), width, 3);//对图片进行缩放的方法 ,这里3为要显示的列数
return null;
} @Override
protected void onPostExecute(Object result) {//在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
handler.removeCallbacks(update);//removeCallbacks方法是删除指定的Runnable对象,使线程对象停止运行。
message.setVisibility(View.GONE);//message设置为不可见
author_message.setVisibility(View.GONE);//author_message设置为不可见
grid.setVisibility(View.VISIBLE);//grid设置为可见
grid.setNumColumns(3);//设置GridView的列数
grid.setHorizontalSpacing(20);//两列之间的间距
grid.setVerticalSpacing(40);//两行之间的间距
grid.setAdapter(adapter);//使用适配器
grid.setOnItemClickListener(new OnItemClickListener() {//GridView 的监听器 public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
Intent intent = new Intent();//实例化Intent
intent.setClass(MenuActivity.this, ShowActivity.class);//设置跳转路径
Bundle bundle = new Bundle();//实例化Bundle类 传值
bundle.putInt("num",position);//传 列表的 位置值 到ShowActivity
intent.putExtras(bundle);//intent发送Bundle
MenuActivity.this.startActivity(intent);//开始跳转
}
});
adapter.notifyDataSetChanged();//在adapter的数据发生变化以后通知UI主线程根据新的数据重新画图。
super.onPostExecute(result);
} protected void onProgressUpdate(Object... values) {//在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况 handler = new Handler();//实例化handler
//显示加载进度
handler.post(update);//根据线程来更新进度 super.onProgressUpdate(values);
}
}.execute();//执行 异步操作
} public void loadingBitmap(Resources resources, int width, int num){ BitmapFactory.Options opts = new BitmapFactory.Options();//BitmapFactory.Options这个类
//仅返回图片的 宽高 这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
opts.inJustDecodeBounds = true;//该值设为true那么将不返回实际的bitmap对象,不给其分配内存空间但是可以得到一些解码边界信息即图片大小等信息。
Bitmap temp = BitmapFactory.decodeResource(resources, fore[0], opts);//加载图片 缩放 从fore【】中第一位开始
int radio = (int) Math.ceil(opts.outWidth / (width*1.0 / num - 30));//向上取整 结果是7,得到缩放比例radio
//Math.ceil(12.2)//返回13
//Math.ceil(12.7)//返回13
//Math.ceil(12.0)// 返回12
opts.inSampleSize = radio;//属性值inSampleSize表示缩略图大小为原始图片大小的几分之一
if(null != temp){
temp.recycle();//回收
}
System.out.println(radio); opts.inJustDecodeBounds = false;//inJustDecodeBounds设为false,就可以根据已经得到的缩放比例得到自己想要的图片缩放图了。 for(int i = 0; i < fore.length; i++){
Bitmap bitmap = BitmapFactory.decodeResource(resources, fore[i], opts);//载入图片
bitmapResource.add(bitmap);//循环添加到集合中
}
}
使用适配器:
BaseAdapter adapter = new BaseAdapter() {
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv = new ImageView(MenuActivity.this);//显示任意图像
iv.setMaxWidth(width / 3 - 30);//设置宽度
iv.setAdjustViewBounds(true);//是否保持宽高比
iv.setImageBitmap(ir.getIconBitmap(position));//设置图片 使用ImageResource类中集合当中的图片
return iv;
}
@Override
public long getItemId(int position) {//得到ID
return position;
}
@Override
public Object getItem(int arg0) {//得到位置
return arg0;
}
@Override
public int getCount() {//得到大小
return ir.size();
}
};
Runnable update = new Runnable() {//实例化线程
@Override
public void run() {
int progress = ir.getProgress();//得到文件的总大小
if(null != message){
message.setText("数据加载中("+progress+"%),请稍等……\n\n");//如果message不是空,就让显示文本
}
if(100 == progress){
handler.removeCallbacks(update);//等于100 也即是说 加载完毕 就停止线程,也就是关闭此定时器
} else {
handler.postDelayed(update, 200);//使用PostDelayed方法,两秒后调用此Runnable对象,实际上也就实现了一个0.2s的一个定时器
}
}
};
android 加载图片防止内存溢出的更多相关文章
- 图片--Android加载图片导致内存溢出(Out of Memory异常)
Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...
- Android加载图片导致内存溢出(Out of Memory异常)
Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...
- 解决android加载图片时内存溢出问题
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过jav ...
- WPF循环加载图片导致内存溢出的解决办法
程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成“动画”. 生成BitmapImage的方法有多种: 1. var source=new BitmapImage(new Uri(" ...
- Android加载大图到内存如何避免内存溢出?
加载大图怎么避免溢出实际做法就是对图像进行压缩,也是比较老的话题了,在最初做android时是经常会遇到的问题,而如今对于图片加载这一块都已经有很成熟稳定的三方库来弄它了,所以图片加载过大内存溢出的比 ...
- [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html 这个可以实现ImageView异步加载 ...
- BitmapFactory 加载图片到内存
Bitmap占用内存分析 Android的虚拟机是基于寄存器的Dalvik,它的最大堆(单个进程可用内存)大小一般是16M,当然不同设备是不一样的,可以查看/system/build.prop文件,[ ...
- android 加载图片oom若干方案小结
本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结. 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定).一般我们可以通过获取当 ...
- Android加载图片OOM错误解决方式
前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片. SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一 ...
随机推荐
- 3D math primer for graphics and game development
三角网格(Triangle Mesh) 最简单的情形,多边形网格不过是一个多边形列表:三角网格就是全部由三角形组成的多边形网格.多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑 ...
- 修改Tomcat命令窗口的名字
在运行多个tomcat窗口的时候,可以通过修改tomcat命令窗口的名字来区分不同的tomcat,修改如下: 找到tomcat下面的这个文件:tomcat_home\bin\catalina.bat, ...
- Uva_11722 Joining with Friend
题目链接 题意: 两个人坐火车, 在某个城市到站的时间段分别为[t1, t2] , [s1, s2],停在站台的时间均为w. 问, 若两人能见面的概率. 思路: 一道基础的几何概型, p = s(m) ...
- BZOJ 1854 游戏
Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有\(2\)个属性,这些属性的值用\([1,10000]\)之间的数表示.当他使用某种装备时,他只能使用该 ...
- win7+ubuntu双系统安装方法
转自win7+ubuntu双系统安装方法 前段时间又安装一下win7+ubuntu双系统,过段时间就会忘记,这次自己写下来,以便以后查看. 1. 先准备一个分区来安装ubuntu.在win7 ...
- Ecshop wap
http://www.08kan.com/gwk/MzA3MDMxMzAxMw/200091492/1/c38b5937e4e819d9908fe3ae964e3dfc.html
- Hibernate 使用HQL的 in 时要注意判断in的值(list)是否包含数据
如果你使用 HQL的 in,例如: sessionFactory.getCurrentSession() .createQuery("select hlInfo.id, count(id) ...
- Javascript函数中传递带空格的参数
通常在页面中要让某些内容点击后产 生点击事件(非页面跳转)都会使用onclick,但是这样不适于需要传递参数的情况,于是写成直接调用Javascript函数的方式:<a href=javascr ...
- php的ob实现页面静态化
php页面静态化的原理,用最少的代码解释页面静态化 如何应用:在插入或更新数据到数据库时,就执行一下代码是一种比较好的方法.比如:php执行add()方法时(就是插入数据时) //开启缓存 Ob_st ...
- LeetCode解题报告:Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...