把从网络获取的图片数据保存在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] 数据的异步加载和图片保存的更多相关文章

  1. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  2. Android之ListView异步加载图片且仅显示可见子项中的图片

    折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...

  3. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

  4. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  5. Android必学-异步加载+Android自定义View源码【申明:来源于网络】

    Android必学-异步加载+Android自定义View源码[申明:来源于网络] 异步加载地址:http://download.csdn.net/detail/u013792369/8867609 ...

  6. 利用WPF的ListView进行大数据量异步加载

    原文:利用WPF的ListView进行大数据量异步加载 由于之前利用Winform的ListView进行大数据量加载的时候,诟病良多,所以今天试着用WPF的ListView来做了一下,结果没有让我失望 ...

  7. Android 实现ListView异步加载图片

    ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; ...

  8. Android ListView 图片异步加载和图片内存缓存

    开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...

  9. ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片

    一.简介 二.代码流程 1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<S ...

随机推荐

  1. MySQL 三 二进制安装

    二进制格式安装   何谓二进制格式安装?   二进制格式安装,编译好的打包在tar文件里,安装时需要下载后解包至编译时指定的位置,然后进行相关配置,完成安装   版本信息:CentOS 7.4 安装m ...

  2. [f]计时器

    // 计时器 function Timer(ele) { this._mStr = ''; this._sStr = ''; this._m = 0; this._s = 0; this._setTi ...

  3. PHP字符串函数之 strcmp strncmp strcasecmp strncasecmp strnatcmp strnatcasecmp

    strcmp – 二进制安全字符串比较 strncmp – 二进制安全比较字符串开头的若干个字符 strcasecmp – 二进制安全比较字符串(不区分大小写) strncasecmp – 二进制安全 ...

  4. elasticsearch 安装,以及遇到的问题总结

    系统.软件环境: Centos 6.5 elasticsearch 6.1.1 elasticsearch 安装的话是很简单的,但是安装完成启动的时候报错,下面我就一一的来描述错误,并提供相应的解决方 ...

  5. Struts2下载及简介

    Struts2下载及简介 一.Struts2下载: 进入网址:http://struts.apache.org/download.cgi#struts23163 可以下载最新的Struts2. 1.F ...

  6. Nginx 教程

    开源版:http://nginx.org 商业版:http://nginx.com 阿里Tengine OpenResty开源版.商业版 视频教程:哔哩哔哩 菜鸟教程:nginx安装 1.初识 Nig ...

  7. 调用opencv相关函数,从视频流中提取出图片序列&&&&jpg图片序列,转化成avi格式视频

    /************************ @HJ 2017/3/30 参考http://blog.sina.com.cn/s/blog_4b0020f301010qcz.html修改的代码 ...

  8. Oracle 数据库字段类型使用说明

    简介 目前Oracle 数据库大概有26个字段类型,大体分为六类,分别是字符串类型.数字数据类型.日期时间数据类型.大型对象(LOB)数据类型.RAW和LONG RAW数据类型.ROWID和UROWI ...

  9. 谷歌浏览器怎么FQ(一)(想使用谷歌浏览器应用商城的小伙伴这边看)

    谷歌浏览器的应用商城里本身有很多不错的扩展程序和插件,比如Wappalyzer(能够识别某个网站用的什么框架和库)广告终结者(能屏蔽大部分浮动,弹窗,甚至视频广告)等 但是谷歌因为某些原因需要FQ以后 ...

  10. kubernetes集群搭建(8):常用命令

    kubectl create -f xxxx.yaml #创建rc.deploy.svc等 kubectl delete -f xxxx.yaml #删除对应的创建 kubectl get pods ...