三、源码分析
==========
从github上clone该项目,可以看到整个项目的代码只包含7个Java源文件,同时,还可进行扩展,方便使用者根据实际图片的来源进行扩展。我们来看看Class逻辑图:
上面有提到,SmartImageView继承自ImageView并自定义了一些方法,能够方便的显示网络图片。在Android中,图片的显示最终都绘制到画布canvas上以位图的形式显示,所以通过逻辑图可以看出定义了一个 SmartImage 接口,而里面有一个返回值为Bitmap的getBitmap方法:
package com.loopj.android.image;
import android.content.Context;
import android.graphics.Bitmap;
public interface SmartImage {
public Bitmap getBitmap(Context context);
}
为什么会定义这个getBitmap方法呢,因为需要加载的图片来源是不一样的,如:从网络加载或从系统联系人头像加载,所以分别让不同来源的类去实现这个接口,然后在该方法中处理逻辑。如图:
我们来看下这三个类的具体代码:
- 【BitmapImage(仅仅是传入Bitmap的实例然后返回)】---->
package com.loopj.android.image;
import android.content.Context;
import android.graphics.Bitmap;
/**
*/
public class BitmapImage implements SmartImage {
//定义Bitmap对象
private Bitmap bitmap;
//构造方法
public BitmapImage(Bitmap bitmap) {
this.bitmap = bitmap;
}
//实现getBitmap方法
public Bitmap getBitmap(Context context) {
return bitmap;
}
}
- 【WebImage(根据Url获取图片资源,需要注意的是这里用到了缓存,注意代码注释)】---->
package com.loopj.android.image;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class WebImage implements SmartImage {
//超时设置
private static final int CONNECT_TIMEOUT = 5000;
private static final int READ_TIMEOUT = 10000;
//缓存对象
private static WebImageCache webImageCache;
//WebImage的构造方法,获取URL
private String url;
public WebImage(String url) {
this.url = url;
}
//实现方法,处理相应的业务逻辑
public Bitmap getBitmap(Context context) {
// Don’t leak context
if(webImageCache == null) {
webImageCache = new WebImageCache(context);
}
// Try getting bitmap from cache first
//此处做了简单的二级缓存(内存缓存和磁盘缓存)
Bitmap bitmap = null;
if(url != null) {
//先从缓存获取bitmap对象
bitmap = webImageCache.get(url);
if(bitmap == null) {
//未找到则从网络加载
bitmap = getBitmapFromUrl(url);
if(bitmap != null){
//加载后将bitmap对象put到缓存中
webImageCache.put(url, bitmap);
}
}
}
return bitmap;
}
/**
-
根据Url获取网络图片资源
-
@param url
-
@return
*/
private Bitmap getBitmapFromUrl(String url) {
Bitmap bitmap = null;
try {
URLConnection conn = new URL(url).openConnection();
conn.setConnectTimeout(CONNECT_TIMEOUT);
conn.setReadTimeout(READ_TIMEOUT);
bitmap = BitmapFactory.decodeStream((Inpu