利用代理模式隔离Android第三方组件(图片加载库,网络库)

最初项目中一直使用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接口并在代理类里替换即可,客户端所有引用的图片操作都不需要修改。网络请求的思路相同代码就不贴了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值