public void display(ImageView ivPic, String url) {
}
/** * 网络缓存的工具类 * * @author ZHY * */ public class NetCacheUtils
{ private LocalCacheUtils localCacheUtils;
private MemoryCacheUtils memoryCacheUtils;
public NetCacheUtils()
{
localCacheUtils = new LocalCacheUtils();
memoryCacheUtils = new MemoryCacheUtils();
}
/** * 从网络下载图片 *
* @param ivPic *
@param url */
public void getBitmapFromNet(ImageView ivPic, String url)
{
// 访问网络的操作一定要在子线程中进行,采用异步任务实现 MyAsyncTask task = new MyAsyncTask(); task.execute(ivPic, url); }
/** * 第一个泛型--异步任务执行的时候,通过execute传过来的参数;
第二个泛型--更新进度; 第三个泛型--异步任务执行以后返回的结果
* * @author ZHY * */
private class MyAsyncTask extends AsyncTask
{ private ImageView ivPic; private String url; // 耗时任务执行之前
--主线程
@Override protected void onPreExecute()
{ super.onPreExecute();
}
// 后台执行的任务
@Override protected Bitmap doInBackground(Object... params)
{
// 执行异步任务的时候,将URL传过来 ivPic = (ImageView) params[0]; url = (String) params[1]; Bitmap bitmap = downloadBitmap(url);
// 为了保证ImageView控件和URL一一对应,给ImageView设定一个标记 ivPic.setTag(url);
// 关联ivPic和URL return bitmap; }
// 更新进度 --主线程
@Override protected void onProgressUpdate(Void... values)
{ super.onProgressUpdate(values);
}
// 耗时任务执行之后--主线程
@Override protected void onPostExecute(Bitmap result)
{ String mCurrentUrl = (String) ivPic.getTag();
if (url.equals(mCurrentUrl))
{ ivPic.setImageBitmap(result);
System.out.println("从网络获取图片");
// 从网络加载完之后,将图片保存到本地SD卡一份,保存到内存中一份
localCacheUtils.setBitmap2Local(url, result);
// 从网络加载完之后,将图片保存到本地SD卡一份,保存到内存中一份 memoryCacheUtils.setBitmap2Memory(url, result);
} } }
/** * 下载网络图片 *
* @param url * @return */
private Bitmap downloadBitmap(String url)
{
HttpURLConnection conn = null;
try
{
URL mURL = new URL(url);
// 打开HttpURLConnection连接
conn = (HttpURLConnection) mURL.openConnection();
// 设置参数 conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setRequestMethod("GET");
// 开启连接 conn.connect();
// 获得响应码 int code = conn.getResponseCode();
if (code == 200) {
// 相应成功,获得网络返回来的输入流
InputStream is = conn.getInputStream();
// 图片的输入流获取成功之后,设置图片的压缩参数,将图片进行压缩 BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
// 将图片的宽高都压缩为原来的一半,在开发中此参数需要根据图片展示的大小来确定,否则可能展示的不正常
options.inPreferredConfig = Bitmap.Config.RGB_565;
// 这个压缩的最小
// Bitmap bitmap = BitmapFactory.decodeStream(is); Bitmap bitmap = BitmapFactory.decodeStream(is, null, options)
;// 经过压缩的图片 return bitmap;
} }
catch (Exception e)
{ e.printStackTrace();
}
finally {
// 断开连接 conn.disconnect();
}
return null;
} }
/**
* 本地缓存
*
* @author ZHY
*
*/
public class LocalCacheUtils {
/**
* 文件保存的路径
*/
public static final String FILE_PATH = Environment
.getExternalStorageDirectory().getAbsolutePath() + "/cache/pics";
/**
* 从本地SD卡获取网络图片,key是url的MD5值
*
* @param url
* @return
*/
public Bitmap getBitmapFromLocal(String url) {
try {
String fileName = MD5Encoder.encode(url);
File file = new File(FILE_PATH, fileName);
if (file.exists()) {
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(
file));
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 向本地SD卡写网络图片
*
* @param url
* @param bitmap
*/
public void setBitmap2Local(String url, Bitmap bitmap) {
try {
// 文件的名字
String fileName = MD5Encoder.encode(url);
// 创建文件流,指向该路径,文件名叫做fileName
File file = new File(FILE_PATH, fileName);
// file其实是图片,它的父级File是文件夹,判断一下文件夹是否存在,如果不存在,创建文件夹
File fileParent = file.getParentFile();
if (!fileParent.exists()) {
// 文件夹不存在
fileParent.mkdirs();// 创建文件夹
}
// 将图片保存到本地
bitmap.compress(CompressFormat.JPEG, 100,
new FileOutputStream(file));
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 内存缓存
*
* @author ZHY
*
*/
public class MemoryCacheUtils {
/*
* 由于map默认是强引用,所有在JVM进行垃圾回收的时候不会回收map的引用
*/
// private HashMap<string, bitmap=""> map = new HashMap<string, bitmap="">();
// 软引用的实例,在内存不够时,垃圾回收器会优先考虑回收
// private HashMap<string, bitmap="">> mSoftReferenceMap = new
// HashMap<string, bitmap="">>();
// LruCache
private LruCache<string, bitmap=""> lruCache;
public MemoryCacheUtils() {
// lruCache最大允许内存一般为Android系统分给每个应用程序内存大小(默认Android系统给每个应用程序分配16兆内存)的八分之一(推荐)
// 获得当前应用程序运行的内存大小
long mCurrentMemory = Runtime.getRuntime().maxMemory();
int maxSize = (int) (mCurrentMemory / 8);
// 给LruCache设置最大的内存
lruCache = new LruCache<string, bitmap="">(maxSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
// 获取每张图片所占内存的大小
// 计算方法是:图片显示的宽度的像素点乘以高度的像素点
int byteCount = value.getRowBytes() * value.getHeight();// 获取图片占用内存大小
return byteCount;
}
};
}
/**
* 从内存中读取Bitmap
*
* @param url
* @return
*/
public Bitmap getBitmapFromMemory(String url) {
// Bitmap bitmap = map.get(url);
// SoftReference<bitmap> softReference = mSoftReferenceMap.get(url);
// Bitmap bitmap = softReference.get();
// 软引用在Android2.3以后就不推荐使用了,Google推荐使用lruCache
// LRU--least recently use
// 最近最少使用,将内存控制在一定的大小内,超过这个内存大小,就会优先释放最近最少使用的那些东东
Bitmap bitmap = lruCache.get(url);
return bitmap;
}
/**
* 将图片保存到内存中
*
* @param url
* @param bitmap
*/
public void setBitmap2Memory(String url, Bitmap bitmap) {
// 向内存中设置,key,value的形式,首先想到HashMap
// map.put(url, bitmap);
// 保存软引用到map中
// SoftReference<bitmap> mSoftReference = new
// SoftReference<bitmap>(bitmap);
// mSoftReferenceMap.put(url, mSoftReference);
lruCache.put(url, bitmap);
}
}</bitmap></bitmap></bitmap></string,></string,></string,></string,></string,></string,>
/**
* 自定义的加载图片的工具类,类似于Xutils中的BitmapUtil,在实际使用中,一般使用BitmapUtil,为了理解三级缓存,
* 这里模拟BitmapUtil自定义了CustomBitmapUtil
*
* @author ZHY
*
*/
public class CustomBitmapUtils {
private Bitmap bitmap;
private NetCacheUtils netCacheUtils;
private LocalCacheUtils localCacheUtils;
private MemoryCacheUtils memoryCacheUtils;
public CustomBitmapUtils() {
netCacheUtils = new NetCacheUtils();
localCacheUtils = new LocalCacheUtils();
memoryCacheUtils = new MemoryCacheUtils();
}
/**
* 加载图片,将当前URL对应的图片显示到ivPic的控件上
*
* @param ivPic
* ImageView控件
* @param url
* 图片的地址
*/
public void display(ImageView ivPic, String url) {
// 设置默认显示的图片
ivPic.setImageResource(R.drawable.ic_launcher);
// 1、内存缓存
bitmap = memoryCacheUtils.getBitmapFromMemory(url);
if (bitmap != null) {
ivPic.setImageBitmap(bitmap);
System.out.println("从内存缓存中加载图片");
return;
}
// 2、本地磁盘缓存
bitmap = localCacheUtils.getBitmapFromLocal(url);
if (bitmap != null) {
ivPic.setImageBitmap(bitmap);
System.out.println("从本地SD卡加载的图片");
memoryCacheUtils.setBitmap2Memory(url, bitmap);// 将图片保存到内存
return;
}
// 3、网络缓存
netCacheUtils.getBitmapFromNet(ivPic, url);
/*
* 从网络获取图片之后,将图片保存到手机SD卡中,在进行图片展示的时候,优先从SD卡中读取缓存,key是图片的URL的MD5值,
* value是保存的图片bitmap
*/
}
}
/**
* Android中三级缓存--网络缓存-本地缓存-内存缓存
*
* @author ZHY
*
*/
public class MainActivity extends Activity {
private ListView list;
private Button btn;
private CustomBitmapUtils utils;
private static final String BASE_URL = "http://192.168.0.148:8080/pics";
// 初始化一些网络图片
String[] urls = { BASE_URL + "/1.jpg", BASE_URL + "/2.jpg",
BASE_URL + "/3.jpg", BASE_URL + "/4.jpg", BASE_URL + "/5.jpg",
BASE_URL + "/6.jpg", BASE_URL + "/7.jpg", BASE_URL + "/8.jpg",
BASE_URL + "/9.jpg", BASE_URL + "/10.jpg", BASE_URL + "/11.jpg",
BASE_URL + "/12.jpg", BASE_URL + "/13.jpg", BASE_URL + "/14.jpg",
BASE_URL + "/15.jpg", BASE_URL + "/16.jpg", BASE_URL + "/17.jpg",
BASE_URL + "/18.jpg", BASE_URL + "/19.jpg", BASE_URL + "/20.jpg",
BASE_URL + "/21.jpg", BASE_URL + "/22.jpg", BASE_URL + "/23.jpg",
BASE_URL + "/24.jpg", BASE_URL + "/25.jpg", BASE_URL + "/26.jpg",
BASE_URL + "/27.jpg", BASE_URL + "/28.jpg", BASE_URL + "/29.jpg",
BASE_URL + "/30.jpg" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
btn = (Button) findViewById(R.id.btn_load);
utils = new CustomBitmapUtils();
// 加载网络图片
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyAdapter adapter = new MyAdapter();
list.setAdapter(adapter);
}
});
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return urls.length;
}
@Override
public String getItem(int position) {
return urls[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(MainActivity.this,
R.layout.item_list, null);
holder = new ViewHolder();
holder.ivPic = (ImageView) convertView.findViewById(R.id.iv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
utils.display(holder.ivPic, urls[position]);
return convertView;
}
class ViewHolder {
ImageView ivPic;
}
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有