imageview显示优化,二级缓存,以及软引用。
来源:互联网 发布:开通淘宝客的条件 编辑:程序博客网 时间:2024/05/16 08:41
package com.app.util;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.HashMap;import java.util.Map;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.widget.ImageView;/** * 异步加载图片并显示图片(Bitmap)缓存:1. 在内存中缓存图片对应的bitmap对象 (一级缓存)2. 将图片保存在手机内部(二级缓存)3. 服务器端 */public class ImageLoader2 {private int defaultBitmapId;private Context context;//内存中缓存图片对象的集合private Map<String, Bitmap> cache = new HashMap<String, Bitmap>();public ImageLoader2(Context context, int defaultBitmapId) {this.defaultBitmapId = defaultBitmapId;this.context = context;}/** * 根据图片路径加载图片并显示 * @param imagepath * @param imageView */public void loadImage(String imagepath, ImageView imageView) {//保存标记imageView.setTag(imagepath);//从一级缓存中取bitmap对象Bitmap bitmap = getFromFirstCache(imagepath);if(bitmap!=null) { //如果有, 直接显示imageView.setImageBitmap(bitmap); return;}//从二级缓存中取bitmap对象bitmap = getFromSecondCache(imagepath);if(bitmap!=null) { //如果有, 直接显示imageView.setImageBitmap(bitmap); return;}//从服务器获取//显示默认图片imageView.setImageResource(R.drawable.shop_photo_frame);loadImageFromNet(imagepath, imageView);}/** * 从服务器端获取图片, 并显示 * @param imagepath * @param imageView */private void loadImageFromNet(final String imagepath, final ImageView imageView) {new AsyncTask<Void, Void, Bitmap>() {@Overrideprotected Bitmap doInBackground(Void... params) {String newPath = (String) imageView.getTag();if(newPath!=imagepath)//如果不相同, 说明imageView已经被复用, 不用加载服务器端的图片return null;Bitmap bitmap = null;try {URL url = new URL(imagepath);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoInput(true);connection.setConnectTimeout(5000);connection.setReadTimeout(5000);connection.connect();if(connection.getResponseCode()==200) {InputStream is = connection.getInputStream(); //图片流bitmap = BitmapFactory.decodeStream(is);if(bitmap!=null) {//缓存到一级缓存中cache.put(imagepath, bitmap);//缓存到二级缓存, 将bitmap保存为一张图片String filename = imagepath.substring(imagepath.lastIndexOf("/")+1);File cacheFile = context.getCacheDir();bitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream(new File(cacheFile, filename)));}}} catch (Exception e) {e.printStackTrace();}return bitmap;}@Overrideprotected void onPostExecute(Bitmap bitmap) {String newPath = (String) imageView.getTag();if(bitmap!=null && newPath==imagepath) {//只有ImageView没有被复用才能显示imageView.setImageBitmap(bitmap);}}}.execute();}/** * 从二级缓存中取bitmap对象 * 图片缓存在: /data/data/packagename/cache/ * @param imagepath : http://.../f1.jpg * @return */private Bitmap getFromSecondCache(String imagepath) {//得到图片的本地路径String filename = imagepath.substring(imagepath.lastIndexOf("/")+1);File cacheFile = context.getCacheDir();String filePath = cacheFile.getAbsolutePath()+"/"+filename; // /data/data/packagename/cache/f1.jpg//加载图片文件, 得到bitmap对象Bitmap bitmap = BitmapFactory.decodeFile(filePath);return bitmap;}/** * 从一级缓存中取bitmap对象 * @param imagepath * @return */private Bitmap getFromFirstCache(String imagepath) {Bitmap bitmap = cache.get(imagepath);return bitmap;}}
0 0
- imageview显示优化,二级缓存,以及软引用。
- 如何修改UIButton的imageView显示以及裁剪图片
- ehcache二级缓存优化
- Android 弱引用二级缓存实现
- Android 笔记 ImageView 显示大图遇到的问题 以及 无损显示大图 的解决方案
- 通过drawable比对界面显示的imageview等是否和资源文件的引用一致
- Android ImageView 不显示JPEG图片 及 Android Studio中如何引用图片资源
- Android ImageView 不显示JPEG图片 及 Android Studio中如何引用图片资源
- 数据显示优化处理以及插件简介
- Android ImageView以及子类
- 圆形imageview以及Blur
- ImageView显示图像
- Toast显示一个ImageView
- ImageView显示网络图片
- ImageView电池电量显示
- ImageView显示图像
- Toast 显示 ImageView
- imageview显示圆形图片
- 面向对象(内部类定义原则)
- 分享维基百科里的深度学习简介
- C++:关联容器(set,multiset,map,multimap)
- http://oj.leetcode.com/problems/valid-number/
- 合肥诺博源软件科技公司是做什么的?
- imageview显示优化,二级缓存,以及软引用。
- 12.linux进程间通信
- 城曲
- CSS3 Flexbox可视化指南
- 破Laravel白屏问题
- C语言函数调用参数压栈的相关问题
- 汇编语言基础知识学习笔记(二)
- android存储相关Vold总结
- Linux进程间通信--shmget()共享内存(一)