转载请注明出处:王亟亟的大牛之路

本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多開始正题

什么是RxJava或者RxAndroid我就不多废话了,理论知识一大堆人给我们做好了。仅仅要自己肯去看就能理解,我这里直接给出传送门:https://github.com/lzyzsd/Awesome-RxJava(非常丰富,看完就基本有概念了)


那么问题来了,人家都解释完了我干嘛?实操个简单的样例吧。正好上周讲了篇Glide的那么这次就实践下

效果图:

我们点开App然后就是一个RecycleView里面有一堆图然后还有文字,文字是本地的,图是网上下的。逻辑流程非常easy,来说一下怎么实现的然后引出主角。

包结构:

GlideModuleConfig配置Glide

StatusBarCompat沉浸式菜单条实现(翔哥那扣来的,这个事实上可有可无主要默认的颜色太丑)

TestOBJ页面对象的属性模型(你也能够不用,个人习惯)

然后就是业务实现的MainActivity和适配器DataAdapter了

我们一个一个类看先是GlideModuleConfig

  1. /**
  2. * Created by jiajiewang on 16/3/25.
  3. */
  4. public class GlideModuleConfig implements GlideModule {
  5. //在这里创建设置内容,之前文章所提及的图片质量就能够在这里设置
  6. //还能够设置缓存池參数什么的
  7. @Override
  8. public void applyOptions(Context context, GlideBuilder builder) {
  9. //设置了默认图片格式
  10. builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
  11. //设置了缓存的位置
  12. builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,"MY_CACHE_LOCATION", 100*1024*1024));
  13. }
  14. //在这里注冊ModelLoaders
  15. @Override
  16. public void registerComponents(Context context, Glide glide) {
  17. }
  18. }

这里做一些配置工作,详细干什么能够看凝视

TestOBJ用于给RecycleView引用图片地址和文字内容

  1. public class TestOBJ {
  2. public String imageUrl;
  3. public String content;
  4. }

翔哥那个类不解释了,能够自己去搜搜百度第一条就是。我们再来看看适配器

DataAdapter(重要步骤的解释也在凝视里了)

  1. public class DataAdapter extends RecyclerView.Adapter {
  2. Context context;
  3. List<TestOBJ> testOBJs;
  4. public DataAdapter(Context context) {
  5. this.context = context;
  6. }
  7. //获取布局
  8. @Override
  9. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  10. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
  11. return new DataViewHolder(view);
  12. }
  13. //详细item的载入图片填充数据
  14. @Override
  15. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  16. DataViewHolder dataViewHolder = (DataViewHolder) holder;
  17. TestOBJ obj = testOBJs.get(position);
  18. //先获取上下文对象,再载入详细的URL然后填充到控件里去
  19. Glide.with(holder.itemView.getContext()).load(obj.imageUrl).into(dataViewHolder.imageIV);
  20. dataViewHolder.contentTV.setText(obj.content);
  21. }
  22. @Override
  23. public int getItemCount() {
  24. return testOBJs == null ?
  25. 0 : testOBJs.size();
  26. }
  27. //控件对象Holder
  28. static class DataViewHolder extends RecyclerView.ViewHolder {
  29. ImageView imageIV;
  30. TextView contentTV;
  31. public DataViewHolder(View itemView) {
  32. super(itemView);
  33. imageIV = (ImageView) itemView.findViewById(R.id.imageIV);
  34. contentTV = (TextView) itemView.findViewById(R.id.contentTV);
  35. }
  36. }
  37. //刷新数据用
  38. public void updateData(List<TestOBJ> testOBJs) {
  39. this.testOBJs = testOBJs;
  40. notifyDataSetChanged();
  41. }
  42. }

数据层已经OK了,我们来看看业务层

  1. public class MainActivity extends AppCompatActivity {
  2. Toolbar toolBar;
  3. RecyclerView recycleView;
  4. DataAdapter dataAdapter;
  5. //URL数据源
  6. String data[] = {"http://hiphotos.baidu.com/zhixin/abpic/item/4651a712c8fcc3cea97dbce49045d688d53f206c.jpg"
  7. , "http://pic.5442.com/2014/0930/06/5442.jpg",
  8. "http://img5q.duitang.com/uploads/item/201410/22/20141022214043_5EEKH.thumb.224_0.jpeg",
  9. "http://img5.duitang.com/uploads/item/201512/08/20151208163159_HGEM2.thumb.224_0.png",
  10. "http://img4.duitang.com/uploads/item/201510/29/20151029224537_ijEKF.thumb.224_0.jpeg",
  11. "http://img5.imgtn.bdimg.com/it/u=1230273521,1023320328&fm=21&gp=0.jpg"
  12. };
  13. //被观察者
  14. Observable observable = Observable.create(new Observable.OnSubscribe<List<TestOBJ>>() {
  15. @Override
  16. public void call(Subscriber<? super List<TestOBJ>> subscriber) {
  17. subscriber.onNext(makeData());
  18. subscriber.onCompleted();
  19. }
  20. });
  21. //观察者
  22. Observer<List<TestOBJ>> observer = new Observer<List<TestOBJ>>() {
  23. @Override
  24. public void onCompleted() {
  25. LogUtils.d("--->onCompleted");
  26. }
  27. @Override
  28. public void onError(Throwable e) {
  29. Toast.makeText(MainActivity.this, "载入失败", Toast.LENGTH_SHORT).show();
  30. }
  31. @Override
  32. public void onNext(List<TestOBJ> testOBJs) {
  33. testOBJs.size();
  34. LogUtils.d("--->onNext testOBJs.size() " + testOBJs.size());
  35. //刷新数据
  36. dataAdapter.updateData(testOBJs);
  37. }
  38. };
  39. @Override
  40. protected void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. setContentView(R.layout.activity_main);
  43. init();
  44. logic();
  45. setSupportActionBar(toolBar);
  46. StatusBarCompat.compat(this, getResources().getColor(R.color.status_bar_color));
  47. StatusBarCompat.compat(this);
  48. }
  49. private void init() {
  50. LogUtils.d("--->init");
  51. toolBar = (Toolbar) findViewById(R.id.toolBar);
  52. recycleView = (RecyclerView) findViewById(R.id.recycleView);
  53. observable.subscribeOn(Schedulers.io())
  54. .observeOn(AndroidSchedulers.mainThread())
  55. .subscribe(observer);
  56. }
  57. private void logic() {
  58. LogUtils.d("--->logic");
  59. dataAdapter = new DataAdapter(MainActivity.this);
  60. recycleView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
  61. recycleView.setAdapter(dataAdapter);
  62. LogUtils.d("--->Glide.getPhotoCacheDir " + Glide.getPhotoCacheDir(MainActivity.this, "MY_CACHE_LOCATION"));
  63. }
  64. //制造数据
  65. private List<TestOBJ> makeData() {
  66. List<TestOBJ> list = new ArrayList<>();
  67. TestOBJ testOBJ;
  68. for (int k = 0; k < 5; k++) {
  69. testOBJ = new TestOBJ();
  70. testOBJ.content = "标题啊,你服不服 " + k + " 个 ";
  71. testOBJ.imageUrl = data[k];
  72. list.add(testOBJ);
  73. }
  74. LogUtils.d("--->list的长度等于 " + list.size());
  75. return list;
  76. }
  77. @Override
  78. protected void onPause() {
  79. super.onPause();
  80. //清除请求
  81. Glide.clear(recycleView);
  82. }
  83. @Override
  84. protected void onDestroy() {
  85. super.onDestroy();
  86. LogUtils.d("--->onDestroy");
  87. //必须主线程使用
  88. Glide.get(this).clearMemory();
  89. //Glide.get(this).clearDiskCache(); 非主线程
  90. }
  91. }

解释:

我们定义了一个观察者和一个被观察者然后自从

  1. observable.subscribeOn(Schedulers.io())
  2. .observeOn(AndroidSchedulers.mainThread())
  3. .subscribe(observer);

注冊的行为開始后,仅仅咬被观察者一有风吹草动,观察者的相关回调就会被触发,我们来看下Log的打印顺序



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

  1. /data/user/0/sample.wjj.rxandroidglidedemo/cache/MY_CACHE_LOCATION

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

初涉RxAndroid结合Glide实现多图片载入操作的更多相关文章

  1. Android图片载入框架最全解析(一),Glide的基本使用方法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53759439 本文同步发表于我的微信公众号.扫一扫文章底部的二维码或在微信搜索 郭 ...

  2. Android图片载入缓存框架Glide

    Glide开源框架是Google推荐的图片载入和缓框架,其在Github上的开源地址是:https://github.com/bumptech/glide 当然一个Google推荐的框架肯定就是Vol ...

  3. Universal-Image-Loader(UIL)图片载入框架使用简介

    这个也是近期项目中使用到的第三方图片载入框架.在这里也自己总结一下,简单的介绍一些使用的方式. UIL图片载入框架特点 简单介绍: 项目地址:https://github.com/nostra13/A ...

  4. Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果

     Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...

  5. Cocos2d-x 3.0心得(01)-图片载入与混合模式

    近期開始用cocos2dx 3.0做东西,略有心(cao)得(dian),略微作下记录吧. v3.0相对v2.2来说,最引人注意的,应该是对触摸层级的优化.和lambda回调函数的引入(嗯嗯.不枉我改 ...

  6. RoundedImageView使用吐槽心得(RoundedImageView与Glide加载图片,第一次加载无法圆角问题)

    最近使用的时候发现一个问题, RoundedImageView与Glide搭配使用的时候,第一次加载图片(内存中没有),后图片无法圆角,后来尝试各种改,最后想到了一个办法,就是让Glide加载图片的 ...

  7. Glide加载图片缓存库出现——You cannot start a load for a destroyed activity

    请记住一句话:不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext.

  8. Android图片加载框架最全解析(五),Glide强大的图片变换功能

    大家好,又到了学习Glide的时间了.前段时间由于项目开发紧张,再加上后来又生病了,所以停更了一个月,不过现在终于又可以恢复正常更新了.今天是这个系列的第五篇文章,在前面四篇文章的当中,我们已经学习了 ...

  9. Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入

    一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...

随机推荐

  1. django web 笔记

    安装 django  pip install django 创建虚拟环境  python -m venv  testenvironment 进入虚拟环境: testenvironment\Script ...

  2. 怎么从docker中copy文件到 本机

    怎么从docker中copy文件到 本机 docker cp <containerId>:/file/path/within/container /host/path/target

  3. Socket tips: 同意socket发送UDP Broadcast

    假设创建一个UDP Socket: socketHandle = socket(serverAddr->ai_family, serverAddr->ai_socktype, server ...

  4. OOM问题定位方法

    1. 背景 线上内存OOM问题是最难定位的问题,最常见的原因: (1)本身资源不够 (2)申请的太多 (3)资源耗尽 某服务器上部署了Java服务,出现OutOfMemoryError,请问有可能是什 ...

  5. [svc][op]SSH公钥认证+优化

    一 ssh公钥认证流程: sshclinet机器:产生公私钥(公钥相当于一把锁) sshclient:将公钥发给sshserver(抛出锁子) sshclinet去连sshserver不需要密钥 二 ...

  6. web 安全问题(一):CSRF 攻击

    什么是CSRF CSRF是怎么产生的 CSRF的攻击对象 CSRG的攻击手段 CSRF的防御措施 什么是CSRF 全称是(Cross Site Request Forgery)跨站请求伪造.也就是恶意 ...

  7. Install haroopad on centos7

    1.Install libs sudo yum install systemd-libs -y 2.Download haroopad goto haroopad1 download bin pack ...

  8. 如何在Windows环境搭建Object C开发环境

    1. 安装编译环境 Object C和其他很多语言一样,都需要有一个编译器.Object C 是在GCC下编译的.GCC(GNU Compiler Collection,GNU编译器集合),是一套由 ...

  9. bnuoj16491

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=16491 题意:有t组测试数据,每组测试数据第一行为n,m,接下来有n种跑法,m为最大的能力,每一种跑 ...

  10. dvwa 源码分析(三) --- config.inc.php分析

    <?php # If you are having problems connecting to the MySQL database and all of the variables belo ...