刚刚开始学习写博客,也不知道怎么描述,就直接上代码了。主要是为了记录自己的成长历程。还请大神们多给意见。
MianActivity.java文件
public class MainActivity extends Activity implements OnClickListener{
private ImageView mImageViewOne;
private ImageView mImageViewTwo;
private ImageLoder mImageLoder;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findById();
init();
}
private void findById(){
mImageViewOne = (ImageView) findViewById(R.id.iv_imageone);
mImageViewTwo = (ImageView) findViewById(R.id.iv_imagetwo);
mButton = (Button) findViewById(R.id.btn_button);
mButton.setOnClickListener(this);
}
private void init(){
}
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.btn_button:
Log.i("tag","btn");
String url = "http://img3.imgtn.bdimg.com/it/u=3681367116,4235384983&fm=21&gp=0.jpg";
String url2 = "http://img55.it168.com/ArticleImages/fnw/2016/0226/29bcd0e5-be19-40f3-9e09-bcca874557c0.jpg";
mImageLoder = new ImageLoder();
mImageLoder.setImageCache(new DouleCache()); //注入缓存 DouleCache(双缓存)
mImageLoder.displayImage(url, mImageViewOne);
mImageLoder.displayImage(url2, mImageViewTwo);
break;
default:
break;
}
}
}
ImageLader.java文件
图片加载器
/**
* 图片加载器
* @author LuoXiang
* @time 2016/3/31 14:30
* @text 在写图片加载器之前我们需要注意三个重要特性:
* @text 1、设计性
* @text 2、扩展性
* @text 3、灵活性
*/
public class ImageLoder {
private ImageCache mImageCache = new MemoryCache(); //默认内存缓存
private Bitmap bitmap = null;
private final int TO_LOAD = 3311430;
//线程池,线程数量为CPU的数量
private ExecutorService mExectorService = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors());
/**
* 注入缓存
* @param cache
*/
public void setImageCache(ImageCache cache){
mImageCache = cache;
}
public void displayImage(String url,ImageView imageView){
Bitmap bitmap = mImageCache.get(url);
if(bitmap == null){
//没有缓存,则提交给线程池进行下载
submitLoadRequest(url,imageView);
}else{
Log.i("tag", "缓存数据");
imageView.setImageBitmap(bitmap);
}
}
/**
* 线程池,图片下载
* @param url
* @param imageView
*/
private void submitLoadRequest(final String url,final ImageView imageView){
imageView.setTag(url);
mExectorService.submit(new Runnable() {
@Override
public void run() {
bitmap = downloadImage(url);
if(bitmap == null){
return;
}
if(imageView.getTag().equals(url)){
mHandler.obtainMessage(TO_LOAD, imageView).sendToTarget();
}
mImageCache.put(url, bitmap);
}
});
}
/**
* 使用HttpURLConnection下载图片
* @param imageUrl 图片下载地址
* @return
*/
public Bitmap downloadImage(String imageUrl){
Bitmap bitmap = null;
try {
URL url = new URL(imageUrl);
final HttpURLConnection mHttpURLConnection = (HttpURLConnection) url.openConnection();
mHttpURLConnection.setDoInput(true);
mHttpURLConnection.connect();
InputStream is = mHttpURLConnection.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
// mHttpURLConnection.disconnect();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
/**
* handler加载图片
*/
Handler mHandler = new Handler(){
@SuppressLint(“HandlerLeak”)
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case TO_LOAD:
Log.i(“tag”, “下载图片”);
ImageView imageView = (ImageView) msg.obj;
imageView.setImageBitmap(bitmap);
break;
default:
break;
}
};
};
}
ImageCache.java 图片缓存文件
package com.learn.imageloder;
import android.graphics.Bitmap;
/**
* 图片缓存
* @author LuoXiang
* @time 2016/3/31 15:00
*/
public interface ImageCache {
public Bitmap get(String url);
public void put(String url,Bitmap bitmap);
}
MemoryCache.java 内存缓存
package com.learn.imageloder;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.Log;
/**
* 内存缓存
* @author LuoXiang
* @time 2016/3/31 16:34
*/
public class MemoryCache implements ImageCache{
LruCache<String, Bitmap> mImageCache;
public MemoryCache(){
initImageCache();
}
private void initImageCache(){
//计算可使用的最大内存
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
//取四分之一的可用内存作为缓存
final int cacheSize = maxMemory / 4;
mImageCache = new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap bitmap) {
//获取图片大小并返回
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
}
};
}
@Override
public Bitmap get(String url) {
return mImageCache.get(url);
}
@Override
public void put(String url, Bitmap bitmap) {
Log.i("tag", "图片存储");
mImageCache.put(url, bitmap);
}
}
DiskCache.java SD卡缓存文件
package com.learn.imageloder;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
/**
* SD卡缓存
* @author LuoXiang
* @time 2016/3/31 15:15
*/
public class DiskCache implements ImageCache{
//sd卡路径
static String cacheDir = “sdcard/cache/”;
/**
* 从缓存中获取图片
* @param url
* @return
*/
@Override
public Bitmap get(String url){
return BitmapFactory.decodeFile(cacheDir + url);
}
/**
* 将图片缓存到sd卡中
* @param url
* @param bitmap
*/
@Override
public void put(String url,Bitmap bitmap){
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(cacheDir + url);
bitmap.compress(CompressFormat.PNG, 100, fileOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if(fileOutputStream != null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
DouleCache.java 双缓存文件
package com.learn.imageloder;
import android.graphics.Bitmap;
/**
* 双缓存
* @author LuoXiang
* @time 2016/3/31 16:47
*/
public class DouleCache implements ImageCache{
ImageCache mMemoryCache = new MemoryCache();
ImageCache mDiskCache = new DiskCache();
/**
* 先从内存缓存中获取图片
* 如果没有,再从SD卡中获取图片
*/
@Override
public Bitmap get(String url) {
Bitmap bitmap = mMemoryCache.get(url);
if(bitmap == null){
bitmap = mDiskCache.get(url);
}
return bitmap;
}
@Override
public void put(String url, Bitmap bitmap) {
mMemoryCache.put(url, bitmap);
mDiskCache.put(url, bitmap);
}
}