最初项目中一直使用ImageLoader加载图片直到Glide的出现,项目面临着艰难的选择,一方面因为Glide的强大决定替换掉ImageLoader,而另一方面项目中大量耦合着ImageLoader加载图片的代码,这意味着巨大的工作量。为了避免之后出现相同的问题,于是我打算利用代理模式重构图片加载与网络请求模块。
代码:项目通用初始化接口
public interface IInitialize {
//初始化
void init(Context context);
}
图片加载器
public interface AiJuImageLoader extends IInitialize{
/**
* 显示图片
*
* @param imageUrl 图片地址
* @param imageView 显示图片的ImageView
* @param defaultImage 默认图片
*/
void displayImage(String imageUrl, ImageView imageView, int defaultImage);
}
图片加载器代理对象
public class AiJuImageLoaderProxy implements AiJuImageLoader {
private AiJuImageLoader imageLoader;
private static volatile AiJuImageLoaderProxy instance;
public static AiJuImageLoaderProxy getInstance() {
if (instance == null) {
synchronized (AiJuImageLoaderProxy.class) {
if (instance == null) {
instance = new AiJuImageLoaderProxy();
}
}
}
return instance;
}
private AiJuImageLoaderProxy() {
imageLoader = new GlideImageLoad();//可任意替换
init(DataProviderManager.getContext());
}
@Override
public void init(Context context) {
imageLoader.init(context);
}
@Override
public void displayImage(String imageUrl, ImageView imageView, int defaultImage) {
imageLoader.displayImage(imageUrl, imageView, defaultImage);
}
}
Glide图片加载器
public class GlideImageLoad implements AiJuImageLoader {
private Context mContext;
@Override
public void init(Context context) {
this.mContext = context;
}
@Override
public void displayImage(String imageUrl, ImageView imageView, int defaultImage) {
Glide.with(mContext)
.load(imageUrl)
.placeholder(defaultImage)
.into(imageView);
}
}
代码调用
String imageUrl="http://images2015.cnblogs.com/news/24442/201703/24442-20170301190900595-1906438193.jpg";
ImageView imageView = (ImageView) findViewById(R.id.iv_test);
AiJuImageLoaderProxy.getInstance().displayImage(imageUrl, imageView, R.mipmap.ic_default);
这样所有的图片加载通过代理类去实现,如果要改变加载框架( Picasso,Fresco),只需要实现AiJuImageLoad接口并在代理类里替换即可,客户端所有引用的图片操作都不需要修改。网络请求的思路相同代码就不贴了。