zoukankan      html  css  js  c++  java
  • [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包,新建一个ContactjavaBean,属性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退出的时候,清除掉所有的缓存文件

    重写activityonDestroy()方法

    循环for(File file:cache:listFiles())中,调用File对象的delete()方法

    删除掉缓存目录

    此时如果数目特别多,会开启很多的线程,同样很消耗资源

    AsyncTask技术采用 (Handler + Thread + 线程池),限定线程的开启数量

    代码正在整理。。。

  • 相关阅读:
    char与unsigned char的区别
    C语言 —— sprintf()函数
    char *s 与 char s[ ]的区别
    打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )
    洛谷P2242 公路维修问题(Road)
    洛谷P1209 [USACO1.3]修理牛棚 Barn Repair
    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication
    洛谷P2246 SAC#1
    Bzoj4300 绝世好题
    Uva1398 Meteor
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5393500.html
Copyright © 2011-2022 走看看