初涉RxAndroid结合Glide实现多图片载入操作

登山则情满于山,观海则意溢于海。这篇文章主要讲述初涉RxAndroid结合Glide实现多图片载入操作相关的知识,希望能为你提供帮助。
转载请注明出处:王亟亟的大牛之路
本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多開始正题
什么是Rxjava或者Rxandroid我就不多废话了,理论知识一大堆人给我们做好了。仅仅要自己肯去看就能理解,我这里直接给出传送门:https://github.com/lzyzsd/Awesome-RxJava(非常丰富,看完就基本有概念了)
那么问题来了,人家都解释完了我干嘛?实操个简单的样例吧。正好上周讲了篇Glide的那么这次就实践下
效果图:

初涉RxAndroid结合Glide实现多图片载入操作

文章图片

我们点开App然后就是一个RecycleView里面有一堆图然后还有文字,文字是本地的,图是网上下的。逻辑流程非常easy,来说一下怎么实现的然后引出主角。
包结构:
【初涉RxAndroid结合Glide实现多图片载入操作】
初涉RxAndroid结合Glide实现多图片载入操作

文章图片

GlideModuleConfig配置Glide
StatusBarCompat沉浸式菜单条实现(翔哥那扣来的,这个事实上可有可无主要默认的颜色太丑)
TestOBJ页面对象的属性模型(你也能够不用,个人习惯)
然后就是业务实现的MainActivity和适配器DataAdapter了
我们一个一个类看先是GlideModuleConfig
/** * Created by jiajiewang on 16/3/25. */ public class GlideModuleConfig implements GlideModule {//在这里创建设置内容,之前文章所提及的图片质量就能够在这里设置 //还能够设置缓存池參数什么的 @Override public void applyOptions(Context context, GlideBuilder builder) { //设置了默认图片格式 builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); //设置了缓存的位置 builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,"MY_CACHE_LOCATION", 100*1024*1024)); }//在这里注冊ModelLoaders @Override public void registerComponents(Context context, Glide glide) {} }

这里做一些配置工作,详细干什么能够看凝视
TestOBJ用于给RecycleView引用图片地址和文字内容
public class TestOBJ { public String imageUrl; public String content; }

翔哥那个类不解释了,能够自己去搜搜百度第一条就是。我们再来看看适配器
DataAdapter(重要步骤的解释也在凝视里了)
public class DataAdapter extends RecyclerView.Adapter { Context context; List< TestOBJ> testOBJs; public DataAdapter(Context context) { this.context = context; }//获取布局 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new DataViewHolder(view); }//详细item的载入图片填充数据 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { DataViewHolder dataViewHolder = (DataViewHolder) holder; TestOBJ obj = testOBJs.get(position); //先获取上下文对象,再载入详细的URL然后填充到控件里去 Glide.with(holder.itemView.getContext()).load(obj.imageUrl).into(dataViewHolder.imageIV); dataViewHolder.contentTV.setText(obj.content); }@Override public int getItemCount() { return testOBJs == null ?
0 : testOBJs.size(); }//控件对象Holder static class DataViewHolder extends RecyclerView.ViewHolder { ImageView imageIV; TextView contentTV; public DataViewHolder(View itemView) { super(itemView); imageIV = (ImageView) itemView.findViewById(R.id.imageIV); contentTV = (TextView) itemView.findViewById(R.id.contentTV); } }//刷新数据用 public void updateData(List< TestOBJ> testOBJs) { this.testOBJs = testOBJs; notifyDataSetChanged(); } }

数据层已经OK了,我们来看看业务层
public class MainActivity extends AppCompatActivity { Toolbar toolBar; RecyclerView recycleView; DataAdapter dataAdapter; //URL数据源 String data[] = {"http://hiphotos.baidu.com/zhixin/abpic/item/4651a712c8fcc3cea97dbce49045d688d53f206c.jpg" , "http://pic.5442.com/2014/0930/06/5442.jpg", "http://img5q.duitang.com/uploads/item/201410/22/20141022214043_5EEKH.thumb.224_0.jpeg", "http://img5.duitang.com/uploads/item/201512/08/20151208163159_HGEM2.thumb.224_0.png", "http://img4.duitang.com/uploads/item/201510/29/20151029224537_ijEKF.thumb.224_0.jpeg", "http://img5.imgtn.bdimg.com/it/u=1230273521,1023320328& fm=21& gp=0.jpg" }; //被观察者 Observable observable = Observable.create(new Observable.OnSubscribe< List< TestOBJ> > () { @Override public void call(Subscriber< ? super List< TestOBJ> > subscriber) { subscriber.onNext(makeData()); subscriber.onCompleted(); } }); //观察者 Observer< List< TestOBJ> > observer = new Observer< List< TestOBJ> > () {@Override public void onCompleted() { LogUtils.d("---> onCompleted"); }@Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, "载入失败", Toast.LENGTH_SHORT).show(); }@Override public void onNext(List< TestOBJ> testOBJs) { testOBJs.size(); LogUtils.d("---> onNexttestOBJs.size() " + testOBJs.size()); //刷新数据 dataAdapter.updateData(testOBJs); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); logic(); setSupportActionBar(toolBar); StatusBarCompat.compat(this, getResources().getColor(R.color.status_bar_color)); StatusBarCompat.compat(this); }private void init() { LogUtils.d("---> init"); toolBar = (Toolbar) findViewById(R.id.toolBar); recycleView = (RecyclerView) findViewById(R.id.recycleView); observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); }private void logic() { LogUtils.d("---> logic"); dataAdapter = new DataAdapter(MainActivity.this); recycleView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); recycleView.setAdapter(dataAdapter); LogUtils.d("---> Glide.getPhotoCacheDir " + Glide.getPhotoCacheDir(MainActivity.this, "MY_CACHE_LOCATION")); }//制造数据 private List< TestOBJ> makeData() { List< TestOBJ> list = new ArrayList< > (); TestOBJ testOBJ; for (int k = 0; k < 5; k++) { testOBJ = new TestOBJ(); testOBJ.content = "标题啊,你服不服 " + k + " 个 "; testOBJ.imageUrl = data[k]; list.add(testOBJ); } LogUtils.d("---> list的长度等于 " + list.size()); return list; }@Override protected void onPause() { super.onPause(); //清除请求 Glide.clear(recycleView); }@Override protected void onDestroy() { super.onDestroy(); LogUtils.d("---> onDestroy"); //必须主线程使用 Glide.get(this).clearMemory(); //Glide.get(this).clearDiskCache(); 非主线程 } }

解释:
我们定义了一个观察者和一个被观察者然后自从
observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer);

注冊的行为開始后,仅仅咬被观察者一有风吹草动,观察者的相关回调就会被触发,我们来看下Log的打印顺序
初涉RxAndroid结合Glide实现多图片载入操作

文章图片

还是在一堆的Activity生命周期里先跑在我们数据摸你的过程中看了可能我们Glide缓存的文件夹,跟我们的预设一致,接着就运行了 onNext再是onCompleted。由于没出什么意外也就没刷出onError
/data/user/0/sample.wjj.rxandroidglidedemo/cache/MY_CACHE_LOCATION

源代码地址:https://github.com/ddwhan0123/RxAndroidDemo








    推荐阅读