您的位置:首页 > 移动开发 > Android开发

换掉图片加载框架引发的血案 代理

2015-10-29 17:06 417 查看

如果图片不能显示 请点击这个地址

今天打算换掉项目中的图片加载框架

好家伙 来问题了

不同的图片加载框架 有不同的API 导致我换掉的话 所有使用的地方都要换掉

我那个后悔啊 没有在项目开始的时候 新建一个自己的类 包装加载框架 提供对外的接口

这样以后换框架的时候 可以只修改本类 的具体实现 对外提供的调用完全不用改变

也就是在程序中调用框架的时候 必须通过我的这个类才能调用 新类对象持有框架对象的引用 所以后面改变原有三方框架可以直接在新类中改变 将框架和我的项目解耦 两者独立 这么一想我发现以后只要使用第三库都需要这样 万一第三库有问题 可以随时切换



今天看 UML类图的时候 发现这个UML类图不错



新类对象叫做代理对象 中间人 中介

这里写了一个Demo 来看看效果

这里没有涉及到标准的设计模式

因为我看了一下 不管是 代理模式还是装饰模式都要实现一个共同的抽象接口 这里貌似不符合 仅仅只是把觉得这样做可以减少后续因为一些原因照成的麻烦

这里用了三个主流的加载框架 UIL Glide Picasso

- 先看效果图 可以看到 随时可以切换 图片加载框架 不需要在整个项目中全部修改



新建一个接口

里面是每种主流框架的具体实现方法

的抽象对象

public interface LoadImageType {

void loadImagePICASSO();

void loadImageGLIDE();

void loadImageUIL();

}

实现类 其中UIL Glide Picasso使用和相关配置就不贴出代码了

/**

* Created by h2h on 2015/10/29.

*/

public class ImageProxyUtils implements LoadImageType{

//后续要增加或者改变就在这里天就 下面的TYPE修改

public static final int TYPE_UIL = 0;
public static final int TYPE_GLIDE = 1;
public static final int TYPE_PICASSO = 2;

public static int TYPE = TYPE_GLIDE;

private RequestManager requestManager;

private Context mContext;
private ImageView mImage;
private String url;
public static ImageProxyUtils imageProxyUtils = new ImageProxyUtils();
public static ImageProxyUtils getImageProxyUtils() {
return imageProxyUtils;
}

//在Glide中fragment的类型
public static final int TYPE_F = 100;
public static final int TYPE_F4 = 101;
public static final int TYPE_FN = 102;  //不是fragment

private Fragment mFragment;
private android.support.v4.app.Fragment mFragment4;

//提供给外面
public void loadImage(Context context, String url, ImageView imageView) {
requestManager = Glide.with(context);
this.mContext = context;
this.mImage = imageView;
this.url = url;

loadImage(TYPE);
}

//这里有多个是因为Glide的特性 可以传入ACtivity Fragment
public void loadImage(Activity context, String url, ImageView imageView) {
requestManager = Glide.with(context);
this.mContext = context;
this.mImage = imageView;
this.url = url;
loadImage(TYPE);
}

public void loadImage(FragmentActivity context, String url, ImageView imageView) {
requestManager = Glide.with(context);
this.mContext = context;
this.mImage = imageView;
this.url = url;
loadImage(TYPE);
}

public void loadImage(Fragment fragment, String url, ImageView imageView) {
requestManager = Glide.with(fragment);
this.mFragment = fragment;
this.mImage = imageView;
this.url = url;
loadImage(TYPE);
}

public void loadImage(android.support.v4.app.Fragment fragment4, String url, ImageView imageView) {
requestManager = Glide.with(fragment4);
this.mFragment4 = fragment4;
this.mImage = imageView;
this.url = url;
loadImage(TYPE);
}

//这里价格判断 重新一个方法 这里是判断方法
private void loadImage(int type) {
switch (type) {
case TYPE_UIL:
Log.e("UIL加载", "OK");
loadImageUIL();
break;

case TYPE_GLIDE:
Log.e("Gilde加载", "OK");
loadImageGLIDE();
break;

case TYPE_PICASSO:
Log.e("PICASSO加载", "OK");
loadImagePICASSO();
break;

default:
break;
}
}

@Override
public void loadImagePICASSO() {
Picasso.with(mContext).load(url)
.placeholder(R.mipmap.ic_launcher)
.into(mImage);
}

@Override
public void loadImageGLIDE() {
requestManager
.load(url)
.centerCrop()
.placeholder(R.mipmap.ic_launcher)
.crossFade()
.into(mImage);
}

@Override
public void loadImageUIL() {
ImageLoader.getInstance().displayImage(url, mImage, ImageLoaderSetting.defaultOptions);
}
}


MainActivity的相关代码

public class MainActivity extends AppCompatActivity {
private ListView lv_show;
private MainDataBean mainDataBean;
private List<MainDataBean.GoodsEntity> lists = new ArrayList<MainDataBean.GoodsEntity>();
private MyAdapter myAdapter;
private Toolbar mToolbar;
private Button bt_uil;
private Button bt_gilde;
private Button bt_picasso;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

bt_uil = (Button) findViewById(R.id.bt_uil);
bt_gilde = (Button) findViewById(R.id.bt_gilde);
bt_picasso = (Button) findViewById(R.id.bt_picasso);

bt_gilde.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageProxyUtils.TYPE = ImageProxyUtils.TYPE_GLIDE;
myAdapter.notifyDataSetChanged();
}
});

bt_uil.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageProxyUtils.TYPE = ImageProxyUtils.TYPE_UIL;

myAdapter.notifyDataSetChanged();
}
});

bt_picasso.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageProxyUtils.TYPE = ImageProxyUtils.TYPE_PICASSO;

myAdapter.notifyDataSetChanged();
}
});

lv_show = (ListView) findViewById(R.id.lv_show);
getData();

}

private void getData() {

RequestBody requestBody = new FormEncodingBuilder()
.add("page", 1 + "")
.build();

Request request = new Request.Builder()
.url("接口url")
.post(requestBody)
.tag(this)
.build();

myAdapter = new MyAdapter(lists, this, R.layout.item);

lv_show.setAdapter(myAdapter);

OkHttpUtil.postData2Server(this, request, new OkHttpUtil.MyCallBack() {
@Override
public void onFailure(Request request, IOException e) {

}

@Override
public void onResponse(String json) {

Gson gson = new Gson();
try {
mainDataBean = gson.fromJson(json, MainDataBean.class);

lists.addAll(mainDataBean.getGoods());

myAdapter.notifyDataSetChanged();

} catch (JsonSyntaxException e) {
e.printStackTrace();
return;
}
}
});
}
}


//这里是一个复写过的Adapter


地址 http://blog.csdn.net/liubo20140401/article/details/49077105

class MyAdapter extends MyBaseAdapter<MainDataBean.GoodsEntity> {

public MyAdapter(List<MainDataBean.GoodsEntity> mDatas, Context mContext, int layoutId) {
super(mDatas, mContext, layoutId);

}

@Override
public void convert(MyViewHolder holder, MainDataBean.GoodsEntity s) {

ImageView imageView = holder.getView(R.id.iv_show);
ImageProxyUtils.getImageProxyUtils().loadImage(mContext, "http://www.gouhao315.com/" + s.getOriginal_img(), imageView);
}  }


贴上一记demo

http://download.csdn.net/detail/liubo080852/9224273
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息