上两篇文章,一篇是写rxjava和retrofit结合,另一篇是mvp+retrofit+rxjava构建开发框架的,但是大家会发现一个问题,我们成功请求了网络数据,但是前两个为什么加载不出来图片呢? 那么问题来了,这么一个完美的网络框架,图片怎么显示呢? 很简单当然是使用Glide了,接下来我们就来学一下Glide如何加载图片。在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。
废话不多说看看Glide是如何使用的,Glide属于链式调用,最基本的用法就是:Glide.with(context).load(url).into(imageview);
Glide是一个快速和有效的开源媒体管理和图像加载Android框架包装媒体解码,内存和磁盘缓存,和资源汇集成一个简单和易于使用的界面
Glide的优点:
- 使用简单
- 可高度配置,自适应度高
- 支持常见图片格式,jpg、png、gif、webp
- 支持多种数据源,网络、资源、assets 、File、Uri等
- 高效缓存策略支持内存和硬盘缓存
- 生命周期集成根据Activity/Fragment生命周期自动管理请求
- 高效处理Bitmap
一、添加依赖
在build.gradle中添加依赖:compile 'com.github.bumptech.glide:glide:3.7.0'
需要support-v4库的支持,如果你的项目没有support-v4库(项目默认已经添加了),还需要添加support-v4依赖:compile 'com.android.support:support-v4:25.1.0'
二、混淆配置
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; }
当然了我们还是需要对应的权限的
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
三、缓存
禁止内存缓存
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
清除内存缓存
// 必须在UI线程中调用
Glide.get(context).clearMemory();
设置缓存
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
DiskCacheStrategy.ALL:缓存源资源和转换后的资源
DiskCacheStrategy.NONE:不作任何磁盘缓存
DiskCacheStrategy.SOURCE:缓存源资源
DiskCacheStrategy.RESULT:缓存转换后的资源
对图片进行裁剪、模糊、滤镜等处理:
推荐使用独立的图片处理库:wasabeef/glide-transformations,使用也很简单:
compile 'jp.wasabeef:glide-transformations:2.0.0'
实现高斯模糊
//radius取值1-25,值越大图片越模糊
Glide.with(context).load(url).bitmapTransform(new BlurTransformation(context, radius)).into(imageView);
当然了Glide的用法还有很多,今天就不一一介绍了,今天主要的目的是为了和我前边的项目结合在一起毕竟那个时候实现的很粗操,网络图片没有办法显示,所以采用了Glide来加载图片,把图片加载,其实就是嫁了一行代码:
Glide.with(context).load(lists.get(i).getImages().getLarge()).bitmapTransform(new BlurTransformation(context,0)).into(holder.iv);
这样我们mvp+Retrofit+rxjava+Glide已经完全加载完毕了。大家如果不明白可以看前两个文章来了解。
这里把adapter显示图片的代码粘贴:
package ledon.com.retrofitdemo.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.util.List;
import jp.wasabeef.glide.transformations.BlurTransformation;
import ledon.com.retrofitdemo.MovieBean;
import ledon.com.retrofitdemo.R;
/**
* Created by Administrator on 2017/3/9.
*/
public class MovieAdapter extends BaseAdapter {
private Context context;
private List<MovieBean.SubjectsBean> lists;
public MovieAdapter(Context context, List<MovieBean.SubjectsBean> lists) {
this.context = context;
this.lists = lists;
}
@Override
public int getCount() {
System.out.println("集合大小:"+lists.size());
return lists.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder holder;
if (convertView==null){
convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
holder=new ViewHolder();
holder.tv_title= (TextView) convertView.findViewById(R.id.tv_title);
holder.tv_name= (TextView) convertView.findViewById(R.id.tv_name);
holder.iv=(ImageView)convertView.findViewById(R.id.iv);
convertView.setTag(holder);
}else {
holder= (ViewHolder) convertView.getTag();
}
//MovieBean.SubjectsBean subjectsBean = lists.get(i).getSubjects().get(i);
holder.tv_title.setText(lists.get(i).getTitle());
Glide.with(context).load(lists.get(i).getImages().getLarge()).bitmapTransform(new BlurTransformation(context,0)).into(holder.iv);
// holder.tv_name.setText(lists.get(i).getCasts().get(i).getName());
holder.tv_name.setText("主演: "+lists.get(i).getCasts().get(0).getName());
return convertView;
}
static class ViewHolder{
TextView tv_title;
TextView tv_name;
ImageView iv;
}
}
下面附图一张: