把从网络获取的图片数据保存在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. adb Android Debug Bridge 安卓调试桥

    adb devices 获取设备列表及设备状态 adb get-state 获取设备的状态,设备的状态有 3 钟,device , offline , unknown device:设备正常连接 of ...

  2. 加盟阿里!贾扬清被曝从Facebook离职,任阿里硅谷研究院VP

    3 月 2 日傍晚,知乎上爆出一则 AI 人事变动大消息——Caffe 作者贾扬清将从 Facebook 离职. 短短数小时,就有近 10 万人浏览这个问题.不仅如此,据 AI 前线爆料,贾扬清离开 ...

  3. nginx并发模型与traffic_server并发模型简单比较

    ginx并发模型: nginx 的进程模型采用的是prefork方式,预先分配的worker子进程数量由配置文件指定,默认为1,不超过1024.master主进程创建监听套接口,fork子进程以后,由 ...

  4. DOM扩展:DOM API的进一步增强[总结篇-上]

    DOM1级主要定义了文档的底层结构,并提供了基本的查询操作的API,总体而言这些API已经比较完善,我们可以通过这些API完成大部分的DOM操作.然而,为了扩展DOM API的功能,同时进一步提高DO ...

  5. MyBatis 源码分析 - 内置数据源

    1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...

  6. 使用tinymce富文本

    1.tinymce入门参考 https://www.tiny.cloud/docs/general-configuration-guide/basic-setup/ 2.tinymce安装选项 htt ...

  7. Linux pwn入门教程(1)——栈溢出基础

    作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42241-1-1.html 0×00 函数的进入与返回 要想理解栈溢出,首先必须 ...

  8. 数据结构(一): 键值对 Map

    Map基本介绍 Map 也称为:映射表/关联数组,基本思想就是键值对的关联,可以用键来查找值. Java标准的类库包含了Map的几种基本的实现,包括:HashMap,TreeMap,LinkedHas ...

  9. Android Fragment用法知识点的讲解

    Android Fragment用法的讲解 碎片,它的出现是为了更好展示UI的设计,让程序更加得到充分的展示.Fragment的出现,如微信的额主界面包含多个Fragment,使得微信功能更加简洁明了 ...

  10. 如何在 SCSS 使用 JavaScript 变量/scss全局变量

    Update2019/3/6:发现一个更好的方法,预处理器加载一个全局设置文件 官方github给出了详细的配置. 在 SCSS 中使用变量很方便,创建一个 variables.scss 文件,里面声 ...