异步加载图片到GridView上,防止OOM
图片资源:
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的更多相关文章
- Android GridView异步加载图片和加载大量图片时出现Out Of Memory问题
我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application No R ...
- ListView与GridView异步加载图片
原理很简单,主要是用到了回调方法,下面是异步加载图片的类 <span style="font-size:16px;">package com.xxx.xxx; impo ...
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...
- [置顶] 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<Strin ...
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...
- 实例演示Android异步加载图片
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- 实例演示Android异步加载图片(转)
本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...
- android listview 异步加载图片并防止错位
网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...
- [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html 这个可以实现ImageView异步加载 ...
随机推荐
- ACM YTU 挑战编程 字符串 Problem A: WERTYU
Problem A: WERTYU Description A common typing error is to place yourhands on the keyboard one row to ...
- MVVM模式应用 之介绍
M-V-VM (1)M:即Model,由现实世界抽象出来的模型: V:即View,视图,界面,该界面与用户输入设备进行交互: 但是View与Model如何进行交互呢? Binding便可以发挥作用了, ...
- TCPIP通信
最近在开发TCPIP通信,封装了3个类,望各位大神指点指点. using System; using System.Collections.Generic; using System.Text; us ...
- [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法
最近把一个项目的jQuery升级到最新版,发现有些页面报错Cannot read property ‘msie’ of undefined.上jQuery网站上搜了一下,原因是$.browser这个a ...
- 使用 fn 标签 解决字数过多时用省略号代替 .............................
list列表单条记录某字段大于10就后面添加省略号(如:内容只是显示开始的10个字,后面的用省略号代替) 在list列表中单条记录某字段大于10就后面添加省略号, 首先引入 jstl标签: <% ...
- 2013年12月26日 星期四 doxygen入门--很好
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- WPF Window异形窗口演示
我们先通过简单的效果展示,切换展示不同图片: 我们先定义图片资源文件,我们可以在window资源中定义,下面的在app.xaml文件来定义: <Application x:Class=" ...
- Laravel之路——缓存使用
1.使用Redis类 use Illuminate\Support\Facades\Redis; //设置指定 key 的值(覆盖老的value) Redis::setex('key','value' ...
- maven web项目不能创建src/main/java等文件夹的问题
eclipse创建maevn web项目,在选择maven_archetype_webapp原型后,默认只有src/main/resources这个Source Floder. 按照maven目录结 ...
- css3实现钟表特效
<!doctype html><html><head><meta http-equiv="Content-Type" content=&q ...