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 + 线程池),限定线程的开启数量

    代码正在整理。。。

  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5393500.html
Copyright © 2011-2022 走看看