[android] 数据的异步加载和图片保存
把从网络获取的图片数据保存在SD卡上,
先把权限都加上
网络权限 android.permission.INTERNET
SD卡读写权限
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.WRITE_EXTERNAL_STORAGE
总体布局
写界面,使用ListView,创建条目的布局文件,水平摆放的ImageView TextView
在activity中获取到ListView对象,调用setAdapter()方法,设置一个适配器
新建一个包 Adapter,新建一个适配器ContactsAdapter继承系统的BaseAdapter
新建一个domain包,新建一个Contact的javaBean,属性id,name,image,有参构造函数
新建一个service包,新建一个ContactService业务类,新建一个静态方法getContacts(),获取联系人的,getImages()获取图片
开启新线程,使用ContactService.getContacts()里面实现获取网络数据,返回List对象,使用Handler传递数据给主线程
创建缓存图片的SD卡目录
获取File对象,通过new File(),获取到SD卡根目录下面的cache文件夹,参数:
Environment.getExternalStorageDirectory(),”cache”文件夹名称
调用File对象的exists()方法,判断目录是否存在,不存在就创建,调用File对象的mkdirs()
展示ListView
设置ContactsAdapter类的构造函数,传递进去参数:数据,布局文件,缓存目录FIle对象
重写getCount()方法,return数据的条数
重写getItem()方法,返回 根据索引得到的集合中的数据,List对象的get()方法,参数:索引
重写getItemId()方法,一般返回数据的索引
重写getView()方法,传递进来的参数:position索引,convertView
convertView是缓存的View对象,当第一屏的时候,该View对象为null,判断如果为null,就调用布局填充器来填充条目布局文件。
通过该View对象找到控件对象,放到包装对象中
因为findViewById()方法是很耗性能的,所以,使用内部类DataWrapper来包装一下找到的两个控件对象
然后调用缓存后的View对象的setTag()方法,参数:包装对象
如果缓存 对象不为null,就调用缓存对象的getTag()方法,得到包装对象,得到控件对象
调用TextView对象的setText()展示文本
展示图片这个地方,很耗时间,如果直接加载容易anr,所以要异步加载图片
异步加载并保存图片
开启线程执行加载图片的代码
在ContactService业务类里实现getImage()方法,通过get方式读取图片,得到Uri对象,参数:图片路径,
获取本地文件File对象,通过new FIle(),参数:缓存目录对象,图片文件名称
图片的文件名称是通过md5()保存的,获取文件后缀,从最后一个点开始截取,path.substring(path.lastIndexOf(“.”))
判断文件存在就直接返回该文件的Uri对象,调用Uri.fromFile(),参数:File对象
get获取网络数据,得到输入流,循环读取保存
读取输入流写到文件输出流中
返回Uri对象
在子线程中无法更新UI,采用Handler技术更新UI
在Handler内部类里面的handleMessage方法里,获取到Uri对象
调用ImageView对象的setImageUri()方法,展示图片,参数:Uri对象
清除缓存
当activity退出的时候,清除掉所有的缓存文件
重写activity的onDestroy()方法
循环for(File file:cache:listFiles())中,调用File对象的delete()方法
删除掉缓存目录
此时如果数目特别多,会开启很多的线程,同样很消耗资源
AsyncTask技术采用 (Handler + Thread + 线程池),限定线程的开启数量
代码正在整理。。。
[android] 数据的异步加载和图片保存的更多相关文章
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- Android之ListView异步加载图片且仅显示可见子项中的图片
折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...
- Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法
Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- Android必学-异步加载+Android自定义View源码【申明:来源于网络】
Android必学-异步加载+Android自定义View源码[申明:来源于网络] 异步加载地址:http://download.csdn.net/detail/u013792369/8867609 ...
- 利用WPF的ListView进行大数据量异步加载
原文:利用WPF的ListView进行大数据量异步加载 由于之前利用Winform的ListView进行大数据量加载的时候,诟病良多,所以今天试着用WPF的ListView来做了一下,结果没有让我失望 ...
- Android 实现ListView异步加载图片
ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; ...
- Android ListView 图片异步加载和图片内存缓存
开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...
- ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片
一.简介 二.代码流程 1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<S ...
随机推荐
- MySQL 三 二进制安装
二进制格式安装 何谓二进制格式安装? 二进制格式安装,编译好的打包在tar文件里,安装时需要下载后解包至编译时指定的位置,然后进行相关配置,完成安装 版本信息:CentOS 7.4 安装m ...
- [f]计时器
// 计时器 function Timer(ele) { this._mStr = ''; this._sStr = ''; this._m = 0; this._s = 0; this._setTi ...
- PHP字符串函数之 strcmp strncmp strcasecmp strncasecmp strnatcmp strnatcasecmp
strcmp – 二进制安全字符串比较 strncmp – 二进制安全比较字符串开头的若干个字符 strcasecmp – 二进制安全比较字符串(不区分大小写) strncasecmp – 二进制安全 ...
- elasticsearch 安装,以及遇到的问题总结
系统.软件环境: Centos 6.5 elasticsearch 6.1.1 elasticsearch 安装的话是很简单的,但是安装完成启动的时候报错,下面我就一一的来描述错误,并提供相应的解决方 ...
- Struts2下载及简介
Struts2下载及简介 一.Struts2下载: 进入网址:http://struts.apache.org/download.cgi#struts23163 可以下载最新的Struts2. 1.F ...
- Nginx 教程
开源版:http://nginx.org 商业版:http://nginx.com 阿里Tengine OpenResty开源版.商业版 视频教程:哔哩哔哩 菜鸟教程:nginx安装 1.初识 Nig ...
- 调用opencv相关函数,从视频流中提取出图片序列&&&&jpg图片序列,转化成avi格式视频
/************************ @HJ 2017/3/30 参考http://blog.sina.com.cn/s/blog_4b0020f301010qcz.html修改的代码 ...
- Oracle 数据库字段类型使用说明
简介 目前Oracle 数据库大概有26个字段类型,大体分为六类,分别是字符串类型.数字数据类型.日期时间数据类型.大型对象(LOB)数据类型.RAW和LONG RAW数据类型.ROWID和UROWI ...
- 谷歌浏览器怎么FQ(一)(想使用谷歌浏览器应用商城的小伙伴这边看)
谷歌浏览器的应用商城里本身有很多不错的扩展程序和插件,比如Wappalyzer(能够识别某个网站用的什么框架和库)广告终结者(能屏蔽大部分浮动,弹窗,甚至视频广告)等 但是谷歌因为某些原因需要FQ以后 ...
- kubernetes集群搭建(8):常用命令
kubectl create -f xxxx.yaml #创建rc.deploy.svc等 kubectl delete -f xxxx.yaml #删除对应的创建 kubectl get pods ...