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异步加载数据和图片的保存思路,后续会给大家整理具体实现代码,更多精彩信息敬请关注我们网站!

(0)

相关推荐

  • Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

  • Android App中实现图片异步加载的实例分享

    一.概述 一般大量图片的加载,比如GridView实现手机的相册功能,一般会用到LruCache,线程池,任务队列等:那么异步消息处理可以用哪呢? 1.用于UI线程当Bitmap加载完成后更新ImageView 2.在图片加载类初始化时,我们会在一个子线程中维护一个Loop实例,当然子线程中也就有了MessageQueue,Looper会一直在那loop停着等待消息的到达,当有消息到达时,从任务队列按照队列调度的方式(FIFO,LIFO等),取出一个任务放入线程池中进行处理. 简易的一个流程:当

  • 深入剖析Android的Volley库中的图片加载功能

    一.基本使用要点回顾 Volley框架在请求网络图片方面也做了很多工作,提供了好几种方法.本文介绍使用ImageLoader来进行网络图片的加载. ImageLoader的内部使用ImageRequest来实现,它的构造器可以传入一个ImageCache缓存形参,实现了图片缓存的功能,同时还可以过滤重复链接,避免重复发送请求. 下面是ImageLoader加载图片的实现方法: public void displayImg(View view){ ImageView imageView = (Im

  • android异步请求服务器数据示例

    1.在android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据: 复制代码 代码如下: thread1 = new Thread(){@Overridepublic void run() {  try {    URL url = new URL(WebUrlManager.CARSEVER_GetCarsServlet);    HttpURLConnection conn = (HttpURLConnectio

  • Android 异步获取网络图片并处理导致内存溢出问题解决方法

    测试环境为Adnroid 2.1以上. 1.AndroidManifest.xml 权限配置: 添加互联网访问权限: 复制代码 代码如下: <uses-permission android:name="android.permission.INTERNET" /> 2.异步图片类 ImageDownloadTask 复制代码 代码如下: import java.io.ByteArrayOutputStream; import java.io.IOException; imp

  • Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而Ima

  • Android开发中ImageLoder进行图片加载和缓存

    图片处理类: package com.longfei.admin.imageloder_text; import android.app.Application; import android.graphics.Bitmap; import android.os.Environment; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universa

  • Android图片加载的缓存类

    本文为大家分享了Android图片加载的缓存类,供大家参考,具体内容如下 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReferenc

  • android开发教程之handle实现多线程和异步处理

    这次浅谈一下Handler,为什么会出现Handler这个功能特性呢?首先,在之前的基本控件,基本都是在Activity的onCreate(Bundle savedInstanceState)方法中调用和处理的,但是,在有些情况,比如在网络上下载软件等一些需要等待响应时间比较长的操作,如果同样放在Activity的该方法中的话,那么在执行该方法的时候,整个Activity是不可动的,用户只能干等着,这样的用户体验是十分差的,这种处理方式带来的最好结果是等待了一段时间后,得到了想要的结果,不好的情

  • Android图片加载缓存框架Glide

    Glide开源框架是Google推荐的图片加载和缓框架,其在Github上的开源地址是:https://github.com/bumptech/glide 当然一个Google推荐的框架肯定就是Volley啦. 目前Android主流开发工具是AndroidStudio,在AndroidStudio如何使用Glide,https://github.com/bumptech/glide上有详细的介绍说明. 因为刚换新工作不久,公司和的还是Eclipse,所以学习Glide我暂时还用的Eclipse

  • 全面总结Android中线程的异步处理方式

    一.概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环.若消息队列为空,线程则会阻塞等待. 说了这一堆,那么和Handler . Looper .Message有啥关系?其实Looper负责的就是创建一个MessageQueue,然后进入一个无限循环体不断

  • Android 异步加载图片分析总结

    研究了android从网络上异步加载图像,现总结如下: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法. 在主线程中new 一个Handler对象,加载图像方法如下所示 复制代码 代码如下: private void loadImage(final String url, final int id) { handler.post(new Runnable() { public void run() { Drawable

随机推荐