package com.example.lainanzhou.imagecachedemo.utils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.Message;
import android.os.StatFs;
import android.util.Log;
import android.util.LruCache;
import android.widget.ImageView;
import android.widget.ListView;
import com.example.lainanzhou.imagecachedemo.R;
import com.example.lainanzhou.imagecachedemo.adapter.NewsAdapter;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* TODO:
* 通过AsyncTask和LRU算法实现图片三级缓存的图片操作类
* 存:
* 1.先网络获取
* 2.存到运行内存中和写到sd卡上
* 取:
* 1.先取运行内存中的图片缓存
* 2.再取sd卡图片缓存资源
* 3.最后取网络上的图片资源
* 还有避免图片出现显示错乱情况(ListView的缓存机制复用convertView导致)
* 设置View的Tag即可避免
*
* @author Joker
* @createDate 2016/7/15.
*/
public class ImageLoader {
private static ImageLoader mImageLoader;
private ImageView iv;
private String mUrl;
public static LruCache<String, Bitmap> mLruCache;
private static final int FREE_SD_SPACE_NEEDED_TO_CACHE = 10;
private android.os.Handler mHandler = new android.os.Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (iv.getTag() == mUrl) {//获取ImageView的tag区别设置图片避免图片显示错乱
Bitmap bitmap = (Bitmap) msg.obj;
iv.setImageBitmap(bitmap);
}
}
};
private int mCorePoolSize = 10;
private int mMaximumPoolSize = 20;
private int mKeepAliveTime ;
private TimeUnit unit = TimeUnit.MILLISECONDS;
// BlockingQueue<Runnable> workQueue = new
// ArrayBlockingQueue<Runnable>(10);// 阻塞队列
private BlockingQueue<Runnable> workQueue = new
LinkedBlockingQueue<Runnable>();// 阻塞队列
private ThreadFactory threadFactory = Executors.defaultThreadFactory();
// RejectedExecutionHandler handler = new
// ThreadPoolExecutor.AbortPolicy();//如果出现错误,则直接抛出异常
// RejectedExecutionHandler handler = new
// ThreadPoolExecutor.CallerRunsPolicy();// 如果出现错误,直接执行加入的任务
// RejectedExecutionHandler handler = new
// ThreadPoolExecutor.DiscardOldestPolicy();//
// 如果出现错误,移除第一个任务,执行加入的任务
private RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();// 如果出现错误,不做处理
//第一种设置AsyncTask线程池方式
private ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(mCorePoolSize,// 核心线程数 : 10
mMaximumPoolSize,// 最大线程数 : 20
mKeepAliveTime,// 保持的时间长度
unit,// keepAliveTime单位
workQueue,// 任务队列
threadFactory,// 线程工厂
handler);// 错误捕获器
//第二种修改AsyncTask线程池方式
private ExecutorService mExecutorService = Executors.newFixedThreadPool(10);
public synchronized static ImageLoader instance() {
if (mImageLoader == null) {
mImageLoader = new ImageLoader();
//获取程序运行时最大内存空间
long maxMemory = Runtime.getRuntime().maxMemory();
int cacheSize = (int) (maxMemory / 4);
mLruCache = new LruCache<String, Bitmap>(cacheSize) {
//获取每次加载对象缓存的内存大小;默认返回的是元素的个数而非内存大小
@Override
protected int sizeOf(String key, Bitmap value) {
//每次存对象都会走的方法
return value.getByteCount();
}
};
}
return mImageLoader;
}
private ImageLoader() {
}
/**
* 直接开启线程处理方式显示图片
* 加锁避免疯狂滑动开启多余线程处理同个url
*
* @param imageView
* @param url
*/
public void showImageFromThread(final ImageView imageView, final String url) {
//取缓存
Bitmap bitmap = getBitmapFromCache(url);
//缓存存在就直接显示
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
Log.d(getClass().getSimpleName(), "取内存缓存" + url);
} else {
synchronized (url) {
new Thread() {
@Override
public void run() {
super.run();
iv = imageView;
mUrl = url;
Bitmap bitmap = getBitmapFromUrl(url);
//缓存图片
addBitmap2Cache(url, bitmap);
Message mes = Message.obtain();
mes.obj = bitmap;
mHandler.sendMessage(mes);
}
}.start();
}
}
}
/**
* 从Url获取bitmap对象
*
* @param urlString
* @return
*/
private Bitmap getBitmapFromUrl(String urlString) {
Bitmap bitmap = null;
InputStream is = null;
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
is = new BufferedInputStream(urlConnection.getInputStream());
bitmap = BitmapFactory.decodeStream(is);//将流对象转成bitmap对象
urlConnection.disconnect();//释放资源
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
public void showImageFromAsyncTask(ImageView imageView, String urlString, boolean isLoader) {
//取缓存
Bitmap bitmap = getBitmapFromCache(urlString);
if (bitmap == null) {
if (isLoader) {
bitmap = getBitmapFromSdCard(urlString);
if (bitmap == null && isLoader)
// new ImageAsyncTask(imageView).execute(urlString);//缓存没有就网络加载
new ImageAsyncTask(imageView,urlString);//缓存没有就网络加载
else if (imageView.getTag().equals(urlString)) {
addBitmap2Cache(urlString, bitmap);//缓存到内存
imageView.setImageBitmap(bitmap);//有缓存就直接显示
Log.d(getClass().getSimpleName(), "取Sd卡缓存" + urlString);
}
} else if (imageView.getTag().equals(urlString)) {
imageView.setImageResource(R.mipmap.ic_launcher);//设置默认图片
}
} else if (imageView.getTag().equals(urlString)) {
imageView.setImageBitmap(bitmap);//有缓存就直接显示
Log.d(getClass().getSimpleName(), "取内存缓存" + urlString);
}
没有合适的资源?快使用搜索试试~ 我知道了~
(原创)使用AsyncTask(带修改线程池方式)+自定义ImageLoader+LRU算法对图片三级缓存及其显示优化
共61个文件
xml:24个
java:6个
bin:6个
4星 · 超过85%的资源 需积分: 40 14 下载量 130 浏览量
2016-07-20
09:18:56
上传
评论
收藏 12.69MB RAR 举报
温馨提示
(原创)使用AsyncTask(带修改线程池方式)+自定义ImageLoader+LRU算法对图片三级缓存及其显示优化(只有在ListView滑动停止的时候才去网络请求获取图片数据)http://blog.csdn.net/lnn368/article/details/51907409
资源推荐
资源详情
资源评论
收起资源包目录
ImageCacheDemo.rar (61个子文件)
ImageCacheDemo
gradlew.bat 2KB
gradlew 5KB
gradle.properties 872B
.gradle
2.10
tasks
_app_compileDebugJavaWithJavac
localJarClasspathSnapshot
localJarClasspathSnapshot.bin 19KB
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis
localClassSetAnalysis.lock 17B
localClassSetAnalysis.bin 93KB
taskArtifacts
fileHashes.bin 137KB
cache.properties.lock 17B
taskArtifacts.bin 111KB
fileSnapshots.bin 3.29MB
cache.properties 31B
outputFileStates.bin 20KB
app
proguard-rules.pro 673B
src
test
java
com
example
lainanzhou
imagecachedemo
ExampleUnitTest.java 344B
androidTest
java
com
example
lainanzhou
imagecachedemo
ApplicationTest.java 380B
main
res
mipmap-xxxhdpi
ic_launcher.png 10KB
drawable
mipmap-hdpi
ic_launcher.png 3KB
values
colors.xml 214B
strings.xml 80B
styles.xml 394B
dimens.xml 216B
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-mdpi
ic_launcher.png 2KB
mipmap-xhdpi
ic_launcher.png 5KB
layout
item_layout.xml 1KB
activity_main.xml 534B
values-w820dp
dimens.xml 364B
java
com
example
lainanzhou
imagecachedemo
bean
NewsBean.java 700B
MainActivity.java 4KB
adapter
NewsAdapter.java 5KB
utils
ImageLoader.java 12KB
AndroidManifest.xml 930B
app.iml 10KB
.gitignore 8B
build.gradle 664B
libs
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 231B
.idea
gradle.xml 739B
runConfigurations.xml 564B
misc.xml 3KB
.name 14B
copyright
profiles_settings.xml 76B
modules.xml 365B
encodings.xml 159B
compiler.xml 686B
workspace.xml 170KB
libraries
support_vector_drawable_23_4_0.xml 651B
support_annotations_23_4_0.xml 517B
hamcrest_core_1_3.xml 526B
junit_4_12.xml 477B
appcompat_v7_23_4_0.xml 772B
animated_vector_drawable_23_4_0.xml 656B
support_v4_23_4_0.xml 914B
ImageCacheDemo.iml 945B
.gitignore 105B
local.properties 439B
settings.gradle 16B
build
intermediates
dex-cache
cache.xml 4KB
generated
mockable-android-23.jar 22.2MB
build.gradle 521B
共 61 条
- 1
资源评论
- 狙击手19862018-06-26感谢楼主,学习了
Joker-L
- 粉丝: 21
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功