[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 ...
随机推荐
- ASM的一些小坑
变量必需放到数据段,才有直接对地址赋值的访问权限 segment .data n1 dw 55h segment .text global _nasm_function _nasm_function: ...
- Linux(以centos7为例)下自动挂载NTFS硬盘
Linux(以centos7为例)下自动挂载NTFS硬盘 作者:子敬叔叔 编写时间:2017年5月3日星期三 需求: 为了熟悉Linux的使用,在自己的笔记本上新安装一个centos7, 但我 ...
- SSM_CRUD新手练习(8)搭建BootStrap分页页面
经过Spring单元测试模拟请求,我们能够成功的取出数据,接下来,我们就开始写用来显示查询数据的分页页面吧. 我们使用Bootstrap来帮助我们快速开发漂亮的页面,具体怎么用可以查看Bootst ...
- Unity全面的面试题(包含答案)
一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3D中 ...
- 8. Filters in ASP.NET MVC 5.0【ASP.NET MVC 5.0中的过滤器】
ASP.NET Filers用来在MVC框架的不同请求处理阶段,注入额外的逻辑.过滤器为横切关注点提供了一种方法(日志记录,授权,缓存). 在这篇文章中,我将会向你介绍MVC框架支持的各种不同种类过滤 ...
- 代码的重构(Refactor-Extract)
1.vs中的代码重构快捷方式:Refactor-Extract: 选中两个需要重构的部分完整代码,右击,选中Refactoe-Extract-Extract Method: 该选中的代码会自动形成一个 ...
- 教你怎么看网站是用react搭建的
概述 SPA和react可以说是web开发的分水岭,我一直在寻找判断网站是普通网站还是SPA抑或是react的方法.今天突然找到一个判断网站是不是react搭建的简便方法.现在记录下来供以后开发时参考 ...
- LabVIEW(十五):右键菜单添加创建VI模版
如果在项目研究中使用到的某一个模版文件次数较多,可以单独为某一个模版文件新建右键选项.以文本格式打开注册表,添加的右键内容即为Data后面的内容.Reg内容不可手动修改,可以通过LabVIEW的编程实 ...
- spring boot 下 thymeleaf 配置
1. thymeleaf 配置参数 [参考文章]:spring-boot-starter-thymeleaf 避坑指南 #<!-- 关闭thymeleaf缓存 开发时使用 否则没有实时画面--& ...
- 关于hermes与solr,es的定位与区别
Hermes与开源的Solr.ElasticSearch的不同 谈到Hermes的索引技术,相信很多同学都会想到Solr.ElasticSearch.Solr.ElasticSearch在真可谓是大名 ...