`
qq466862016
  • 浏览: 128451 次
  • 来自: 杭州
社区版块
存档分类
最新评论

listview 图片异步加载 的实现并缓存到内存 和本地sdcard 中

阅读更多
package com.dodoyota.weicom.net;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;

import com.weibo.sdk.android.util.FormatTools;
import com.weibo.sdk.android.util.MD5Utils;

/**
 * 异步加载图片
 * @author 高元东
 * @mailto 466862016@qq.com
 * 2013-6-20 下午9:58:57
 */
public class AsyncImageLoader {
	
	public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();
	private static  ExecutorService executorService = Executors.newFixedThreadPool(5);
	private final Handler handler = new Handler();
	
	
	/***
	 * 异步加载图片
	 * @mailto 466862016@qq.com
	 * 2013-6-20 下午10:01:34
	 * @param imageUrl
	 * @param callback
	 * @return
	 */
	public Drawable loadDrawable(final String imageUrl,
			final ImageCallback callback) {
		// 如果缓存过就从缓存中取出数据
		if (imageCache.containsKey(MD5Utils.encode(imageUrl))) {
			SoftReference<Drawable> softReference = imageCache.get(MD5Utils.encode(imageUrl));
			if (softReference.get() != null) {
				Log.i("imageloader", "从缓存中获取图片");
				return softReference.get();
			}
		}
		
		//sdcard 可用使用
		  if(this.checkSdcard()) {
			  Drawable drawable = null;
			  File dir = new File(Environment.getExternalStorageDirectory()+"/weicom");
			   if(!dir.exists()) {
				   dir.mkdir();
			   }
			   
			   File header = new File(dir, MD5Utils.encode(imageUrl));
			   if(header.exists()) {
				   FileInputStream fileInputStream = null;
				try {
					fileInputStream = new FileInputStream(header);
					//从sdcard 中取数据
					
					    drawable = Drawable.createFromStream(fileInputStream, "ayscimage");
					    Log.i("imageloader", "从sdcard获取图片");
					   if(!imageCache.containsKey(MD5Utils.encode(imageUrl))) {
						   //在sdcard 中取出的图片放在缓存中
						   imageCache.put(MD5Utils.encode(imageUrl), new SoftReference<Drawable>(drawable));
					   }
					   return drawable;
				} catch (Exception e) {
					e.printStackTrace();
				}
				   
			   }
			  
		  }
		// 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中
		executorService.submit(new Runnable() {
			public void run() {
				try {
					final Drawable drawable = loadImageFromUrl(imageUrl); 
						
					imageCache.put(imageUrl, new SoftReference<Drawable>(
							drawable));
					 
					Log.i("imageloader", "将图片保存在缓存中");
					/***
					 * 保存在sdcard 中
					 */
					if(checkSdcard()) {
						 File dir = new File(Environment.getExternalStorageDirectory()+"/weicom");
						   if(!dir.exists()) {
							   
							   dir.mkdir();
						   }
						   
						   File header = new File(dir, MD5Utils.encode(imageUrl));
						   
						   
							   FileOutputStream fileOutputStream = new FileOutputStream(header);
							   FormatTools formatTools = FormatTools.getInstance();
							   byte[] by = formatTools.Drawable2Bytes(drawable);
							   fileOutputStream.write(by);
							   fileOutputStream.flush();
							   Log.i("imageloader", "将图片保存在sdcard ");
						  
					}

					handler.post(new Runnable() {
						public void run() {
							callback.imageLoaded(drawable);
						}
					});
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		});
		return null;
	}
	
	
	
	/***
	 * 按照 url  从网络上获取 图片
	 * @mailto 466862016@qq.com
	 * 2013-6-20 下午10:00:40
	 * @param imageUrl
	 * @return
	 */
	protected Drawable loadImageFromUrl(String imageUrl) {
		try {
			Log.i("imageloader", "从网络中获取图片");
			return Drawable.createFromStream(new URL(imageUrl).openStream(),
					"iamgeSync");

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/***
	 * 检查sdcard 是否可用
	 * @mailto 466862016@qq.com
	 * 2013-6-20 下午10:08:18
	 * @return
	 */
	private boolean checkSdcard() {
		
		String status = Environment.getExternalStorageState();
		if(status.equals(Environment.MEDIA_MOUNTED)) {
			return true;
		}
		return false;
		
	}
	/***
	 * 对外开放的接口
	 * @author 高元东
	 * @mailto 466862016@qq.com
	 * 2013-6-20 下午10:00:03
	 */
	public interface ImageCallback {
			public void imageLoaded(Drawable imageDrawable);
		}
}

 

分享到:
评论

相关推荐

    android从服务器端下载图片并保存在本地sdcard里并在界面滚动显示出来

    综上所述,"android从服务器端下载图片并保存在本地sdcard里并在界面滚动显示出来"这个过程涉及了网络请求、文件操作、图片缓存、异步处理、UI显示优化等多个技术点,需要综合运用多种Android开发技巧和第三方库。...

    android之从SD卡加载大图片

    本知识点将详细介绍如何在Android系统中有效地加载和显示SD卡上的大尺寸图片,避免性能瓶颈。 首先,理解Android的内存限制至关重要。Android设备的可用内存相对较小,尤其是对于低内存设备。当尝试加载大图片时,...

    读取SDcard Database并在Android ListView显示的处理流程

    在Android开发中,将SD卡上的数据库数据读取并显示在ListView中是一个常见的需求,尤其在数据量较大、需要分页加载或者缓存数据时。这个过程涉及到Android系统的文件操作、SQLite数据库操作以及UI组件的使用。以下是...

    Android的相册,读取sdcard里的相片

    在Android系统中,读取SDCard...通过ListView、GridView和Gallery(或其替代品)可以灵活地展示SDCard中的照片,为用户提供良好的浏览体验。在实现过程中,要注意性能优化和用户体验设计,确保应用的稳定性和效率。

    android读取sdcard的txt文件,翻书的效果

    在Android平台上,开发一款应用来实现从SDCard中读取TXT文件并展示为翻书效果,需要涉及到多个技术层面。以下将详细介绍这个过程中的关键知识点: 1. **Android权限管理**: 在Android中,访问外部存储(如SDCard...

    安卓SD卡文件管理更新信息相关-文件选择器.zip

    在Android应用中,通常会使用`BitmapFactory`来解析图片,`ImageView`来展示,并且可能涉及到内存管理和异步加载策略。 总的来说,这个压缩包提供的资料可以帮助我们了解如何在Android环境中实现SD卡文件管理,特别...

    android SD卡文件浏览器

    9. **性能优化**:为了提高加载速度和用户体验,可以使用缓存策略,例如只加载部分文件或使用懒加载机制。此外,对大文件或大量文件的处理要特别注意内存管理。 通过以上技术,开发者可以构建一个功能完善的Android...

    Android扫描音乐文件

    结合自定义的`BaseAdapter`或`CursorAdapter`,可以将查询到的音乐信息映射到ListView的各个项,实现列表的动态加载。 5. **UI设计**:在ListView中,每个音乐项可能包含歌曲名、歌手、专辑封面等信息,这需要...

    基于android系统的文件浏览器

    在实际开发过程中,除了基本功能外,还需要考虑性能优化(如使用异步加载文件列表),错误处理(如文件不存在或权限不足时的提示),以及用户体验(如提供搜索功能、多种视图模式等)。此外,遵循Material Design...

    安卓文件浏览器

    7. **异步处理**:考虑到文件操作可能会较慢,推荐使用异步任务(如`AsyncTask`)或者Android的`LiveData`和`ViewModel`来实现后台加载和更新UI,避免阻塞主线程。 8. **性能优化**:在处理大量文件时,注意缓存...

    文件浏览器

    文件操作可能涉及大量数据,因此需要考虑性能优化,如异步加载文件列表,使用缓存策略,以及在处理大量文件时避免阻塞主线程。 10. **安全性和隐私**: 文件浏览器应遵循安全最佳实践,不访问敏感文件,防止恶意...

    Android手机SD卡文件浏览器

    5. **性能优化**:考虑到文件数量可能很大,遍历过程应避免一次性加载所有文件,而是采用异步加载、分页显示等策略,以减少内存消耗和提高响应速度。此外,可以利用缓存机制,将最近访问的文件信息存储起来,以提高...

    Android经典项目案例开发实战宝典(郭金尚) 实例源代码 和 第5章文件管理器 电子文档

    10. **性能优化**:在大量文件操作时,考虑缓存策略、流操作的效率和内存管理,以提高应用性能。 通过阅读《Android经典项目案例开发实战宝典》的第5章并动手实践提供的源代码,开发者可以深入理解上述知识点,并...

    android文件管理器源代码

    在Android平台上,开发一款文件管理器是相当常见的实践,它允许用户查看、操作和管理设备上的文件和目录。本文将深入解析"android文件管理器源代码",介绍关键概念、设计思路以及源代码中的核心功能。 一、Android ...

Global site tag (gtag.js) - Google Analytics