Android实现异步加载图片
短信预约 -IT技能 免费直播动态提醒
麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的.
今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧.因为麦洛之前实现异步加载图片都是使用了AsynTask这个API,继续这个类,实现起来非常简单也很方便.在doInBackground()方法里实现下载逻辑.具体实现如下
实现逻辑是:先从内存中读取,如果内存中有这张图片,则直接使用;如果内存没有再到sdcard上读取,如果有则显示;如果sdcard上还没有则到网络上读取.内存中开启缓存是参考了网上的实现.麦洛在这里非常感谢喜欢分享的程序猿们.
public class ImageDownloader extends AsyncTask<String, Integer, Object> { private static final String TAG = "ImageDownloader"; // 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动) private Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>(); private ImageView mImageView; public ImageDownloader(ImageView image) { mImageView = image; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Object doInBackground(String... params) { // Log.i("ImageDownloader", "loading image..."); String url = params[0]; Drawable drawable = null; try { if (!"".equals(url) && url != null) { String fileName = url.hashCode()+".jpg"; // 如果缓存过就从缓存中取出数据 if (imageCache.containsKey(fileName)) { SoftReference<Drawable> softReference = imageCache.get(fileName); drawable = softReference.get(); if (drawable != null) { return drawable; } } File dir = new File(FileConstant.IMAGE_FILE_PATH); if (!dir.exists()) { boolean m = dir.mkdirs(); } File file = new File(dir, fileName); if (file.exists() && file.length() > 0) { Log.i(TAG, "load image from sd card"); // 如果文件存在则直接读取sdcard drawable = readFromSdcard(file); } else { //file.createNewFile(); Log.i(TAG, "load image from network"); URL imageUrl = new URL(url); // 写入sdcard if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { saveImageFile(imageUrl, file); drawable = Drawable.createFromStream(new FileInputStream(file), fileName); }else{ //直接从流读取 drawable = Drawable.createFromStream(imageUrl.openStream(), fileName); } } if(drawable!=null){ //保存在缓存中 imageCache.put(fileName, new SoftReference<Drawable>(drawable)); } } } catch (Exception e) { e.printStackTrace(); } return drawable; } private void saveImageFile(URL url, File file) { FileOutputStream out = null; InputStream in = null; try { file.deleteOnExit(); out = new FileOutputStream(file); in = url.openStream(); byte[] buf = new byte[1024]; int len = -1; while((len = in.read(buf))!=-1){ out.write(buf, 0, len); out.flush(); } } catch (Exception e) { e.printStackTrace(); } finally { if(out!=null){ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } if(in!=null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } private Drawable readFromSdcard(File file) throws Exception { FileInputStream in = new FileInputStream(file); return Drawable.createFromStream(in, file.getName()); } @Override protected void onPostExecute(Object result) { super.onPostExecute(result); Drawable drawable = (Drawable) result; if (mImageView != null && drawable != null) { mImageView.setBackgroundDrawable(drawable); } } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected void onCancelled() { super.onCancelled(); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Android实现异步加载图片
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
Android实现异步加载图片
麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的.今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧.因为麦洛之前实现异步加载图片
2023-05-31
Android实现图片缓存与异步加载
ImageManager2这个类具有异步从网络下载图片,从sd读取本地图片,内存缓存,硬盘缓存,图片使用动画渐现等功能,已经将其应用在包含大量图片的应用中一年多,没有出现oom。
Android程序常常会内存溢出,网上也有很多解决方案,如软
2022-06-06
Android实现ListView异步加载图片的方法
本文实例讲述了Android实现ListView异步加载图片的方法。分享给大家供大家参考。具体如下:
ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说
2022-06-06
Android实现图片异步加载及本地缓存
在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载
2022-06-06
Android 异步加载图片的实例代码
异步加载图片的主要流程是进行判断缓存中是否存在图片,如果存在则直接返回,如果不存在则进行下载并进行缓存。
以下是建立一个异步下载类: 代码如下:/** * User: Tom * Date: 13-5-13 * Time: 下午8:07 *
2022-06-06
Android实现图片异步加载并缓存到本地
在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片。
软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下载图片,如果下载后就存到本地,下次读取时
2022-06-06
Android App中实现图片异步加载的实例分享
一、概述
一般大量图片的加载,比如GridView实现手机的相册功能,一般会用到LruCache,线程池,任务队列等;那么异步消息处理可以用哪呢?
1、用于UI线程当Bitmap加载完成后更新ImageView
2、在图片加载类初始化时,我
2022-06-06
Android 异步加载图片分析总结
研究了android从网络上异步加载图像,现总结如下: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法。 在主线程中new 一个Handler对象,加载图像方法如
2022-06-06
Android ListView异步加载图片方法详解
本文实例讲述了Android ListView异步加载图片方法。分享给大家供大家参考,具体如下:
先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销。
这样做无疑是
2022-06-06
android异步加载图片并缓存到本地实现方法
在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载
2022-06-06
2024-04-02
Android实现图片异步请求加三级缓存
使用xUtils等框架是很方便,但今天要用代码实现bitmapUtils 的功能,很简单,
AsyncTask请求一张图片
####AsyncTask
#####AsyncTask是线程池+handler的封装 第一个泛型: 传参的参数类
2022-06-06
Android实现从缓存中读取图片与异步加载功能类
本文实例讲述了Android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下:
在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现。public class AsyncImag
2022-06-06
Android实现Listview异步加载网络图片并动态更新的方法
本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法。分享给大家供大家参考,具体如下:
应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片、店名、活动详情、地址、电话和距离等。
在布局文
2022-06-06
Android编程学习之异步加载图片的方法
本文实例讲述了Android编程学习之异步加载图片的方法。分享给大家供大家参考,具体如下:
最近在android开发中碰到比较棘手的问题,就是加载图片内存溢出。我开发的是一个新闻应用,应用中用到大量的图片,一个界面中可能会有上百张图片。开发
2022-06-06
Android中Glide加载图片并实现图片缓存
今天工作中遇到Glide的缓存问题,之前在项目中一直用Glide加载本地及网络图片,但是没有考虑过缓存的问题,但是需求中需要提到了,所以在网上查了一下,再这里和大家简单的分享一下Glide的使用方法以及缓存
首先,Glide是Github
2022-06-06
Android 实现加载大图片的方法
项目简介:
该项目为加载大图片
详细介绍:
对于超大的图片,如果不缩放的话,容易导致内存溢出。而经过处理后,无论多大的图片,都能够在手机屏幕上加载出来,不会导致内存溢出。当然,脸黑的除外
该应用涉及到的知识有:
- 1.Bitmap的使用
2022-06-06
Android异步加载数据和图片的保存思路详解
把从网络获取的图片数据保存在SD卡上,先把权限都加上网络权限 android.permission.INTERNETSD卡读写权限android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.pe
2022-06-06
Android中使用二级缓存、异步加载批量加载图片完整案例
一、问题描述
Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取、再从文件中获取,最后才会访问网络。内存缓存(一级)本质上是Map集合以ke
2022-06-06
Android ListView实现ImageLoader图片加载的方法
本文实例讲述了Android ListView实现ImageLoader图片加载的方法。分享给大家供大家参考,具体如下:最近一直忙着做项目,今天也是忙里偷闲,想写篇博客来巩固下之前在应用中所用的知识。之前我们可能会也会肯定遇到了图片的异步加
2023-05-30