ImageLoder图片加载器《Android源码设计模式第一章学习笔记》

刚刚开始学习写博客,也不知道怎么描述,就直接上代码了。主要是为了记录自己的成长历程。还请大神们多给意见。

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);
}

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值