RX系列四 | RxAndroid | 加载图片 | 提交表单
RX系列四 | RxAndroid | 加载图片 | 提交表单
说实话,学RxJava就是为了我们在Android中运用的更加顺手一点,也就是RxAndroid,我们还是先一步步来,学会怎么去用的比较好,之前的三篇算是铺垫,让你有一点认识,那Rx在Android中有什么好处呢?我们先模拟一些原始功能和他对比下
一.加载图片
很多人说Rx出来之后,是编程思想的一种进阶,实际上我学习了这种思想之后,确实是觉得有了很大的改变,不过,需要一点学习成本再加上,需要对原先的思想有些改观,使得我依旧有点不适应,不知道为啥,可能就像用了好几年的Eclipse,突然让我用Android Studio的时候的那种感觉,不过,技术在进步,每个人也需要去接受,没有好坏之分,那我们就在讲解Rx之前,我们先把思路,逻辑来做一个铺垫吧,首先,我们要准备一些东西的,因为涉及了网络请求,下载等功能,所以我们肯定是要去添加下网络权限
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET"/>
然后我们再来说一下,我们现在要干的事情,先易后难,我们先来加载一张图片,我们传统的做法是通过AsyncTask去做,但是这样的代码很长很沉闷,而在我们的Activity中,其实上一个Activity的本身他是有很多的工作要做的,这样导致代码会很多,不容易重构等,所以才会有现在的MVC,MVP等架构去解耦,所以我们既然Rx编程本身是一套很简洁的代码,那我们应该用什么方法去合理的实现呢?我们来写个解析的方法,因为需要用到OkHttp,所以请在gradle里添加
//OkHttp3
compile 'com.squareup.okhttp3:okhttp:3.+'
这样才好去加载,我们写个方法吧
//加载图片
private Observable<byte[]> lodingImg(String imgPath){
return Observable.create(new Observable.OnSubscribe<byte[]>() {
@Override
public void call(Subscriber<? super byte[]> subscriber) {
if(!subscriber.isUnsubscribed()){
//解析图片
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(imgPath).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
subscriber.onError(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
byte [] bytes = response.body().bytes();
if(bytes != null){
subscriber.onNext(bytes);
}
}
//结束
subscriber.onCompleted();
}
});
}
}
});
}
这个方法可以看到我们返回值是一个byte字节数组参数的被观察者Observable,然后传递一个地址,我们就直接return回去一个Observable,在Observable里面,我们做了什么事情呢?其实我们就直接用OkHttp去解析了一张图片,拿到了byte之后,通过subscriber.onNext(bytes)传递给了观察者,让他去做操作,当然,别忘了调用onCompleted去告知观察者已经结束了操作,而在观察者这边,你需要做什么呢?
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_download:
lodingImg(IMG_PATH)
//网络访问
.observeOn(Schedulers.io())
//UI线程
.observeOn(AndroidSchedulers.mainThread())
//订阅
.subscribe(new Observer<byte[]>() {
@Override
public void onCompleted() {
Log.i(TAG,"onCompleted");
}
@Override
public void onError(Throwable e) {
Log.i(TAG,e.toString());
}
@Override
public void onNext(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
img.setImageBitmap(bitmap);
}
});
break;
}
}
其实可以看到,我们直接就去订阅了一个subscribe,在onNext里面,通过BitmapFactory的方法转换成一个Bitmap,这就是Rx加载的处理方式,这种方式将对我们产生很大的影响,我们最起码现在懂得了他的一点套路了,我们来看下运行结果
OK,也是很顺利的加载出来了
二.提交表单
如果说加载图片是get的话,那提交表单就是post了,我们来看一下提交表单该怎么写,我们假设是做一个登陆注册的功能,那就很简单了,我们看下我们这次要做的代码
//登录
private Observable<String> fromLogin(String url, Map<String,String> params){
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
if(!subscriber.isUnsubscribed()){
OkHttpClient client = new OkHttpClient();
FormBody.Builder builder = new FormBody.Builder();
if(params!=null && !params.isEmpty()){
for (Map.Entry<String, String>entry:params.entrySet()){
builder.add(entry.getKey(),entry.getValue());
}
}
RequestBody requestBody = builder.build();
//构建post请求
Request request = new Request.Builder().url(url).post(requestBody).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
subscriber.onError(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
subscriber.onNext(response.body().string());
}
//访问结束
subscriber.onCompleted();
}
});
}
}
});
}
这段代码里面,我们可用看到,我们定义了一个方法,返回值是一个String类型的被观察者Observable,而传递的参数就是登陆的地址和一个Map键值对,我们直接return一个Observable即可,在里面我们使用OkHTTP提交表单,最后通过onNext返回结果,通过onCompleted告知结束操作,而在我们的观察者里面我们应该怎么做?
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
String name = et_name.getText().toString().trim();
String password = et_password.getText().toString().trim();
if (!TextUtils.isEmpty(name)) {
if(!TextUtils.isEmpty(password)){
Map<String,String> params = new HashMap<>();
params.put("name",name);
params.put("password",password);
fromLogin(LOGIN_URL,params)
//网络访问
.observeOn(Schedulers.io())
//UI线程
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
Log.i(TAG,"onCompleted");
}
@Override
public void onError(Throwable e) {
Log.i(TAG,e.toString());
}
@Override
public void onNext(String s) {
Log.i(TAG,s);
}
});
}else {
Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();
}
}else {
Toast.makeText(this, "账号不能为空", Toast.LENGTH_SHORT).show();
}
break;
}
}
在这个点击事件里,我们可用看到直接把参数塞进去后通过subscribe订阅拿到结果,这样如果登录成功就跳转了,这就是一整套的逻辑,这里没有地址,就不演示了,到这里,我相信大家对基本的使用应该是没什么问题了,一句话概括,就是异步,让我们的代码逻辑性更强,当然, 现在的例子还不能友好的表达出精髓,大家有兴趣的可以接着后续的系列
Sample下载:系列最后一篇提供
有兴趣的可以加群:555974449
RX系列四 | RxAndroid | 加载图片 | 提交表单的更多相关文章
- JavaScript之加载表格、表单行数据[插件]
/*** * name:加载表格或表单数据[通用] * name:load-table-or-form-data-common.js * * author:zengtai * date:2017-07 ...
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...
- Android之批量加载图片OOM问题解决方案
一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本 ...
- CSS3学习总结——实现瀑布流布局与无限加载图片相册
首先给大家看一下瀑布流布局与无限加载图片相册效果图: 一.pic1.html页面代码如下: <!DOCTYPE html> <html> <head> <me ...
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目 Android-Universal-Image-Loader 或者 ignition 都是个很好的选择. 在这里把原来 ...
- Android之使用Android-AQuery异步加载图片(一)
第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...
- 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转
最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...
- 使用UIL(Universal-Image-Loader)异步加载图片
概要: Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是实现可重复使用的异步图像加载.缓存和显示.所以,如果你的程序里需要这个功能的话,使用它,因为 ...
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...
随机推荐
- win10 apache配置虚拟主机后localhost无法使用
win10系统配置虚拟主机1.用记事本或Sublime Text打开httpd.confctrl + f 搜索httpd-vhosts.conf 将#Include conf/extra/httpd- ...
- c#之监控文件结构
如果需要知道修改文件或目录的时间,可以通过FileSystemWatcher类,这个类提供了一下应用程序可以捕获的事件,应用程序可以对事件作出响应. 使用FileSystemWatcher非常简单,首 ...
- shell编程-邮件发送设置
在linux 运维过程中,经常会写一些脚本监控一些服务器的状态,如监控redis 主从切换,redis 宕机等,当事件发生时,应该发送邮件通知到相对应的管理员,因此就需要搭建邮件服务,使linux 能 ...
- keil应用小贴士:Use MicroLIB是干什么的
在keil 建立ARM的工程时,其中有一项是选 use MicroLIB 查了查,得到了以下信息: microlib 是缺省 C 库的备选库. 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使 ...
- [HNOI 2011]数矩形
Description 题库链接 给出平面上 \(n\) 个点,选出四个点作为矩形顶点.求出矩形最大面积. \(1\leq n\leq 1500\) Solution 转载自 Z-Y-Y-S dark ...
- PKUWC 2018 滚粗记
day0 上午居然考了一场考试,大爆炸,攒了一波RP,下午也没有心思去落实题目,而是一心去搞颓废,到了晚上看时间还早,于是就看了一波上午考试的Solution,懵逼.jpg day1 上午考数学,前一 ...
- 【20170920校内模拟赛】小Z爱学习
所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...
- 棋盘 chess
Description 给出一张 n × n 的棋盘,格子有黑有白.现在要在棋盘上放棋子,要求: • 黑格子上不能有棋子 • 每行每列至多只有一枚棋子 你的任务是求出有多少种合法的摆放方案.答案模 1 ...
- 细胞(cell) 矩阵快速幂
题目描述小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并观察细胞分裂的规律.他选取了一种特别的细胞,每天每个该细胞可以分裂出 x 1 个新的细胞.小 X 决定第 i 天向培养皿中 ...
- hdu 5492 (暴力+nice)
题意:在矩阵中,找一条路从 (1,1)->(n,m),使方差最小 思路: T = (N+M−1)∑N+M−1i=1(Ai−Aavg)2 将N + M - 1乘进去,即求1 ~ N+M-1,(N ...