图片资源:

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的一个定时器
}
}
};

												

异步加载图片到GridView上,防止OOM的更多相关文章

  1. Android GridView异步加载图片和加载大量图片时出现Out Of Memory问题

    我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application No R ...

  2. ListView与GridView异步加载图片

    原理很简单,主要是用到了回调方法,下面是异步加载图片的类 <span style="font-size:16px;">package com.xxx.xxx; impo ...

  3. Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...

  4. [置顶] 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<Strin ...

  5. Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片

    一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...

  6. 实例演示Android异步加载图片

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  7. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  8. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

  9. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

随机推荐

  1. Memcached认知[分布式]

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. Memcached的服务器客户端通信使用简单的基于文本行的协议. Memcached基于一个存储键/值对的 ...

  2. Zend Studio 11.0.2 破解和汉化

    本方法适用于Zend Studio 11.0.2,亲测,其他版本未知. 破解方法:覆盖安装目录 plugins 里同名文件,启动任意输入即可注册. Windows版下载地址:http://downlo ...

  3. CentOS+Apache+php无法访问redis的解决方法

    PHP 使用 Redis 安装 开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP. 接下来让我们安装 PH ...

  4. 怎样制作PHP验证码?

    <?php /** *制作验证码 *1.启动session *2.设定标头 *3.创建画布 *4.创建颜色 *5.创建随机数并放到画布上 *6.将得到的若干随机数放入session中 *7.添加 ...

  5. 学渣也要搞 laravel(1)—— 安装篇

    看到laravel(我叫它:拉瓦)那么热门,我也决定学上一学. Laravel 5.2 在 5.1 基础上继续改进和优化,添加了许多新的功能特性:多认证驱动支持.隐式模型绑定.简化Eloquent 全 ...

  6. 十进制和n进制的转换(10进制转换为36进制)

    答案如下: void Convert() { map<int ,string> maps; maps[0]="0"; maps[1]="1"; ma ...

  7. 【python】原始字符创

    原始字符串语法在字符串前加"r" 如 tem=r"h\c\d\n"print(tem) 结果:h\c\d\n 注意:字符串结尾不能是\,否则报错,应对措施将\单 ...

  8. WebApi学习总结系列第三篇(Http)此篇持续更新...

    越了解Http对WebApi开发就越有帮助,因为WebApi就是建立在Http基础之上的. 一.Http: 通过 <ASP.NET Web API 2 框架揭秘>一书中 了解到 什么叫We ...

  9. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  10. BZOI 1507 [NOI2003] Editor

    Background After trying to solve problem EDIT1(Editor) and being ****ed by Brainf**k, Blue Mary deci ...