android 异步加载图片缩略图

发布时间:2021-10-22 05:26:40

建一个AsyncLoadedImage类继承AsyncTask异步加载类,调用publishProgress方法更新onProgressUpdate贮存缩略图信息到Adapter。监听Adapter Change实现异步加载缩略图。


main.xml




android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

android:id="@+id/sdcard"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />


MFile.java




public class MFile extends Activity {
private GridView sdcardImages;
private FileAdapter fileAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);

setupViews();
setProgressBarIndeterminateVisibility(true);
new AsyncLoadedImage().execute();
}

/*
* 释放Bitmap内存
*/
protected void onDestroy() {
super.onDestroy();
final GridView grid = sdcardImages;
final int count = grid.getChildCount();
ImageView v = null;
for (int i = 0; i < count; i++) {
v = (ImageView) grid.getChildAt(i);
((BitmapDrawable) v.getDrawable()).setCallback(null);
}
}

/*
* 初始化文件浏览View
*/
private void setupViews() {
sdcardImages = (GridView) findViewById(R.id.sdcard);
sdcardImages.setOnItemClickListener(new fileListener());
fileAdapter = new FileAdapter(getApplicationContext());
sdcardImages.setAdapter(fileAdapter);
}

/*
* 刷新Adapter
*/
private void addImage(LoadedImage... value) {
for (LoadedImage image : value) {
fileAdapter.addPhoto(image);
fileAdapter.notifyDataSetChanged();
}
}

/*
* 点击监听
*/
class fileListener implements OnItemClickListener {

@Override
public void onItemClick(AdapterView paramAdapterView,
View paramView, int paramInt, long paramLong) {
}
}

/*
* 异步加载缩略图到LoadedImage然后调用addImage方法更新Adapter
*/
class AsyncLoadedImage extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
String path = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/hfdatabase/3/img";
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
} else {
File[] files = file.listFiles();
String[] paths = new String[files.length];
Bitmap bitmap;
Bitmap newBitmap;
for (int i = 0; i < files.length; i++) {
paths[i] = files[i].getPath();
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 10;
bitmap = BitmapFactory.decodeFile(paths[i], options);
newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 80,
80);
bitmap.recycle();
if (newBitmap != null) {
publishProgress(new LoadedImage(newBitmap));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}

@Override
public void onProgressUpdate(LoadedImage... value) {
addImage(value);
}

@Override
protected void onPostExecute(Object result) {
setProgressBarIndeterminateVisibility(false);
}
}

/*
* Adapter
*/
class FileAdapter extends BaseAdapter {

private Context mContext;
private ArrayList photos = new ArrayList();

public FileAdapter(Context context) {
mContext = context;
}

public void addPhoto(LoadedImage photo) {
photos.add(photo);
}

public int getCount() {
return photos.size();
}

public Object getItem(int position) {
return photos.get(position);
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
} else {
imageView = (ImageView) convertView;
}
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(8, 8, 8, 8);
imageView.setImageBitmap(photos.get(position).getBitmap());
return imageView;
}
}

/*
* 这是个保存bitmap的类,加入Adapter的ArrayList中,随着addImage更新Adapter
*/
private static class LoadedImage {
Bitmap mBitmap;

LoadedImage(Bitmap bitmap) {
mBitmap = bitmap;
}

public Bitmap getBitmap() {
return mBitmap;
}
}

/*
* 消息提示
*/
private Toast toast;

public void showMsg(String arg) {
if (toast == null) {
toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT);
} else {
toast.cancel();
toast.setText(arg);
}
toast.show();
}
}


相关文档

  • 秋天洗衣服作文500字
  • 在虚拟环境使用pyinstaller命令打包.py程序成为exe可执行文件发布给其他用户
  • 2020年公司新人入职自我介绍(精选3篇)
  • 神奇的玉米须
  • 小黑历险记
  • 有关《中小学生感恩教育》的观后感
  • 怎样关闭mysql
  • border-radius 50%和100%的区别
  • 羊水少怎么回事
  • 【Android学习笔记】App Widget 桌面小插件
  • 证据表明百度蜘蛛可以爬行纯文本网址
  • 微信SEO培训:微信SEO优化该如何做呢?
  • 有关乡村夜景的作文
  • 《武松打虎》读书笔记3篇
  • Makefile -MM -M 参数说明
  • 关于合作的精选句子
  • 济南市艺考培训学校哪个好
  • 工厂买卖契约书
  • 秋季养生的注意事项有哪些
  • 《春望》内容赏析
  • 相思的经典古代诗句
  • 平板电脑总是在开机画面怎么办
  • IDEA中 NOTE: Picked up JDK_JAVA_OPTIONS:问题求解?
  • 关于田野的好句好段
  • 我喜欢的一则格言作文300字
  • 七年级政治上册课时检测试题
  • 求一篇关于侵犯著作权的案例及分析
  • 必须知道大学新兴专业有哪些
  • 田径运动会加油稿三篇
  • win8中dll后缀文件强制删除的一个方法
  • 猜你喜欢

  • Mysql 8.0 权限概述与授权(一)
  • 城府的同义词有哪些及造句
  • g++ vscode 环境选择_vscode配置C++环境的图文教程
  • 加强城市配电网安全的技术措施探讨
  • 最新一年级下册语文看拼音写汉字
  • 七年级新生自我介绍范文精选3篇
  • 关于开学第一课日记范文集锦九篇
  • 华为watch gt2怎么重启
  • 2019版高考生物二轮复*非选择题标准练(8)
  • 初三语文上册月考试卷及答案
  • 汽油发动机的喷油器故障及维护
  • 新买的惠普笔记本电脑小欧开不了机怎么办
  • 最新精品 2015~2016学年度 湘教版三年级上册英语期末试卷
  • 企业员工安全生产基本知识培训
  • 循环流化床风室的压力脉动特性分析
  • 扑克记忆教程
  • 2021年扬州大学化学化工学院825物理化学(理)考研仿真模拟五套题
  • 最新-爆破工程第七章-PPT文档资料
  • 研究性学*计划
  • *面汇交力系教案
  • 保定维特瑞交通设施工程有限责任公司-防御性驾驶技术培训
  • 运销公司优秀班组评比活动方案
  • 最新 2011年4月党员思想汇报:清明小感-精品
  • 【CN109571412A】一种机械臂自主导航移动系统和方法【专利】
  • 当代工笔花鸟画对宋代花鸟画的借鉴与探索
  • 我的一家作文小学500字 我爱我家
  • 高一语文下册期末教学质量检测试题5
  • 【自考】数据结构之排序
  • 浅析西汉屯垦实施对生态环境的影响
  • 雕塑项目可行性研究报告(可编辑)
  • 一岁宝宝补锌吃什么
  • 合肥钮斯贸易有限公司企业信用报告-天眼查
  • 2019教育优选-八年级物理上册 1.2 运动的描述课件 新人教版精品文档
  • 《麻醉药品临床应用指导原则》发布
  • 20XX年六一儿童节送给小孩子的祝福短信
  • 厦门德重机电设备有限责任公司(企业信用报告)- 天眼查
  • 鲍勃·迪伦诗歌创作中的绘画因素
  • 教科六年级科学下《三 宇宙 探索宇宙》公开课课件_1
  • 2018年内蒙古专业技术人员工匠精神考试答案解析标准版
  • 【创意教案】2019最新幼儿教育-中班健康活动教案 孤独的小兔
  • 新时期在现代医药商品流通企业开展职工思想政治教育工作的实践与思考
  • 2018-2019第一学期八年级生物期末考试试卷(有答案)
  • 电脑版