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开发中ImageLoder进行图片加载和缓存深入剖析Android的Volley库中的图片加载功能Android图片加载缓存框架GlideAndroid图片加载的缓存类Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)全面总结Android中线程的异步处理方式Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案android异步请求服务器数据示例android开发教程之handle实现多线程和异步处理Android 异步加载图片分析总结Android 异步获取网络图片并处理导致内存溢出问题解决方法Android App中实现图片异步加载的实例分享
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341