[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 ...
随机推荐
- eclipse怎么删除多余的tomcat server(2)
首先你的Server要是可用状态,就是说当前这个tomcat处于可用状态才能点击那个Create Launch Configuration
- Note | LaTeX
目录 一.TeX家族 1. TeX - LaTeX 2. pdfTeX - pdfLaTeX 3. XeTeX - XeLaTeX 4. CTeX - MiKTeX - TeX Live 二.入门 1 ...
- array_filter()函数
用回调函数过滤数组中的值 array_filter(array,callbackfunction); 返回过滤后的数组
- 《Node.js 高级编程》简介与第二章笔记
<Node.js 高级编程> 作者简介 Pedro Teixerra 高产,开源项目程序员 Node 社区活跃成员,Node公司的创始人之一. 10岁开始编程,Visual Basic.C ...
- PMP:4.项目整合管理
内容中包含 base64string 图片造成字符过多,拒绝显示
- Thinking in Java Chapter 13
From Thinking in Java 4th Edition String对象是不可变的.String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包 ...
- 4.json解析
格式 {"name":"zhangsan", "age":18, "books":[{"name": ...
- 使用 PLSQL 提示动态执行表不可访问,本会话的自动统计被禁止
使用PLSQL,第一次执行表的select操作的时候,提示"动态执行表不可访问,本会话的自动统计被禁止",如上图: 这种问题,一看就是当前连接用户没有对sys用户下的表v$sess ...
- 开发微信小程序——古龙小说阅读器
概述 由于面试的关系接触了一下微信小程序,花了2晚上开发了一个带书签功能的古龙小说阅读器,并且已经提交审核等待发布.这篇博文记录了我的开发过程和对微信小程序的看法,供以后开发时参考,相信对其他人也有用 ...
- ffmpeg命令: 删除视频中不需要的音频流
1.ffprobe gf.mkv 查看 2.ffmpeg -i gf.mkv -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mkv 注: -m ...