初涉RxAndroid结合Glide实现多图片载入操作
转载请注明出处:王亟亟的大牛之路
本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多開始正题
什么是RxJava或者RxAndroid我就不多废话了,理论知识一大堆人给我们做好了。仅仅要自己肯去看就能理解,我这里直接给出传送门:https://github.com/lzyzsd/Awesome-RxJava(非常丰富,看完就基本有概念了)
那么问题来了,人家都解释完了我干嘛?实操个简单的样例吧。正好上周讲了篇Glide的那么这次就实践下
效果图:
我们点开App然后就是一个RecycleView里面有一堆图然后还有文字,文字是本地的,图是网上下的。逻辑流程非常easy,来说一下怎么实现的然后引出主角。
包结构:
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("--->onNext testOBJs.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的打印顺序
还是在一堆的Activity生命周期里先跑在我们数据摸你的过程中看了可能我们Glide缓存的文件夹,跟我们的预设一致,接着就运行了 onNext再是onCompleted。由于没出什么意外也就没刷出onError
/data/user/0/sample.wjj.rxandroidglidedemo/cache/MY_CACHE_LOCATION
初涉RxAndroid结合Glide实现多图片载入操作的更多相关文章
- Android图片载入框架最全解析(一),Glide的基本使用方法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53759439 本文同步发表于我的微信公众号.扫一扫文章底部的二维码或在微信搜索 郭 ...
- Android图片载入缓存框架Glide
Glide开源框架是Google推荐的图片载入和缓框架,其在Github上的开源地址是:https://github.com/bumptech/glide 当然一个Google推荐的框架肯定就是Vol ...
- Universal-Image-Loader(UIL)图片载入框架使用简介
这个也是近期项目中使用到的第三方图片载入框架.在这里也自己总结一下,简单的介绍一些使用的方式. UIL图片载入框架特点 简单介绍: 项目地址:https://github.com/nostra13/A ...
- Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果
Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...
- Cocos2d-x 3.0心得(01)-图片载入与混合模式
近期開始用cocos2dx 3.0做东西,略有心(cao)得(dian),略微作下记录吧. v3.0相对v2.2来说,最引人注意的,应该是对触摸层级的优化.和lambda回调函数的引入(嗯嗯.不枉我改 ...
- RoundedImageView使用吐槽心得(RoundedImageView与Glide加载图片,第一次加载无法圆角问题)
最近使用的时候发现一个问题, RoundedImageView与Glide搭配使用的时候,第一次加载图片(内存中没有),后图片无法圆角,后来尝试各种改,最后想到了一个办法,就是让Glide加载图片的 ...
- Glide加载图片缓存库出现——You cannot start a load for a destroyed activity
请记住一句话:不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext.
- Android图片加载框架最全解析(五),Glide强大的图片变换功能
大家好,又到了学习Glide的时间了.前段时间由于项目开发紧张,再加上后来又生病了,所以停更了一个月,不过现在终于又可以恢复正常更新了.今天是这个系列的第五篇文章,在前面四篇文章的当中,我们已经学习了 ...
- Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入
一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...
随机推荐
- Java WebService 简单实例(转
一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService ...
- php将session保存到数据库的类实例(php版本需要大于5.4)
这里实现了一个把session存储到数据库的类,包括数据表的创建.类的使用.php的配置. 可以更好地进行用户控制管理. 做项目的时候,有一个需求,是要实现禁止一个账号两处登录.同时要统计当前在线用户 ...
- cocos2dx 3.3将坐标由父空间转化到局部空间
设在node的父空间内有一点p,要求其转化到node局部空间后的坐标p_local,代码如下: node->getNodeToParentTransform();//in order node- ...
- Flume入门
1.Flume是什么? ○ Flume是由cloudera开发的实时日志收集系统 ○ 核心概念是由一个叫做Agent(代理节点)的java进程运行在日志收集节点 ○ Flume在0.94. ...
- 分享下今天研究的流量上限DDos攻击分析和解决方式
分享下今天研究的流量上限DDos攻击分析和解决方式 常常听到或者碰到某个站点被攻击.一般都是流量攻击.今天自己写了个程序測下相关的上限,程序仅仅简单做了个get html操作(不包括图片等资源文件). ...
- 【Android】11.6 Fragments基本用法示例
分类:C#.Android.VS2015: 创建日期:2016-02-22 一.简介 该例子演示了如何使用两个fragment创建双区域布局的activity(纵向和横向).在这个activity包含 ...
- ubantu下安装软件
Linux系统中,软件通常以源代码或者预编译包的形式提供.(1)软件源代码需要编译为二进制的机器代码才能够使用,安装比较耗时,不过您可以自行调节编译选项,决定需要的功能或组件,或者针对硬件平台作一些优 ...
- VC++ 知识点
1.寻找文件时,CFileFind类的使用. 2.寻找目录时使用BROWSEINFO,其中包含了用户选中目录的重要信息. 3.LPITEMIDLIST类 4.目录选择对话框的使用SHBrowseFor ...
- 【转】kafka&zookeeper集群搭建指南
[转自]:http://www.cnblogs.com/luotianshuai/p/5206662.html 待续...
- redis使用redis-cli查看所有的keys及清空所有的数据
redis_home:redis安装路径: cd %redis_home%/src ./redis-cli -h 127.0.0.1 127.0.0.1:6379> keys * (em ...