RxJava + volley 实践
2016-05-02 08:56
701 查看
RxAndroid,RxJava最近一直比较火的,自己也学习了好长的时间,现在与大学分享一下的,我用的是RxJava,RxAndroid,Volley现在与RxJava接合处理接口的比较好的有retrofit(处理网络请示),但是我喜欢用的是Volley,特点就是短小,快,RxJava在网上已经有好多文章说这个东西的,基本的东西我就不说了的,所以有基本的看这篇文章是最好的,没有基本的可以去看以下文章,http://gank.io/post/560e15be2dca930e00da1083
(扔物线)。
首先,我对RxJava的理解就是整条逻辑在一条线是,最最最重要的是随着程序逻辑变得越来越复杂,它依然能够保持简洁,也就是说我写逻辑的时候10行代码,我用rxJava 5行基本能解决问题,并且逻辑不复杂。
我用的开发工具是Android Studio ,贴出gradle文件
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.3'
compile ‘com.mcxiaoke.volley:library:1.0.19' // 是Volley
compile ‘com.google.code.gson:gson:2.2.4'
先把Volley的寝环境做好的,VolleyManager代码
只需要调用VolleyManager的init方法就可以把Volley的环境初始化好。
下面在写的就是用Volley的请求代码,RxVolleyRequest如下:
现在基本的代码都写完了的,下面我们看一下一个奇葩需求的(处理接口),App用户登录,用户点登录按钮 1 调用得到用户的token接口(如果没有得到用户的token,则用户没有注册过的 ,跳到注册页面,用户点获取短信按钮,调用获取短信接口 11 用户点注册按钮,调用注册接口 22 注册完后跳转到完善个人信息页面,调用完善个人信息接口,注册成功) 2 根据id调用得到用户信息接口,登录成功。
看到上面的需求是不是感觉到欲生欲死的啊,这还不是太复杂的,如果是更加复杂的,我感觉我一天是做不完了的,又要加班,加班宝宝不开心啊,现在好了,RxJava来了,处理起来就不难了的。
登录代码如下
注册模块
开始注册
(扔物线)。
首先,我对RxJava的理解就是整条逻辑在一条线是,最最最重要的是随着程序逻辑变得越来越复杂,它依然能够保持简洁,也就是说我写逻辑的时候10行代码,我用rxJava 5行基本能解决问题,并且逻辑不复杂。
我用的开发工具是Android Studio ,贴出gradle文件
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.3'
compile ‘com.mcxiaoke.volley:library:1.0.19' // 是Volley
compile ‘com.google.code.gson:gson:2.2.4'
先把Volley的寝环境做好的,VolleyManager代码
public class VolleyManager { private static RequestQueue mRequestQueue; private VolleyManager() { // no instances } public static void init(Context context) { mRequestQueue = Volley.newRequestQueue(context); } public static RequestQueue getRequestQueue() { if (mRequestQueue != null) { return mRequestQueue; } else { throw new IllegalStateException("Not initialized"); } } }
只需要调用VolleyManager的init方法就可以把Volley的环境初始化好。
下面在写的就是用Volley的请求代码,RxVolleyRequest如下:
public class RxVolleyRequest { //该方法返回的是一个Observable,这种的是还需要进行在一步封装的,用泛型,这里我就不处理了的,也不会用的,给大家一个例子,也就是说我们完全可以把请求网络屏蔽了。 public static Observable<JSONObject> getRequestObservable(final int method,final String url) { return Observable.create(new Observable.OnSubscribe<JSONObject>() { @Override public void call(Subscriber<? super JSONObject> subscriber) { try { //stringRequest方法是用volley请示数据 subscriber.onNext(stringRequest(method,url)); } catch (Exception e) { e.printStackTrace(); subscriber.onError(e); } } }); }
//请求网络数据并返回,用的是Volley的StringRequest public static String stringRequest(int method, String url) throws Exception { RequestFuture<String> requestFuture = RequestFuture.newFuture(); StringRequest stringRequest = new StringRequest(method, url, requestFuture,requestFuture); VolleyManager.getRequestQueue().add(stringRequest); JSONObject rootJson = new JSONObject(requestFuture.get()); return rootJson; }
现在基本的代码都写完了的,下面我们看一下一个奇葩需求的(处理接口),App用户登录,用户点登录按钮 1 调用得到用户的token接口(如果没有得到用户的token,则用户没有注册过的 ,跳到注册页面,用户点获取短信按钮,调用获取短信接口 11 用户点注册按钮,调用注册接口 22 注册完后跳转到完善个人信息页面,调用完善个人信息接口,注册成功) 2 根据id调用得到用户信息接口,登录成功。
看到上面的需求是不是感觉到欲生欲死的啊,这还不是太复杂的,如果是更加复杂的,我感觉我一天是做不完了的,又要加班,加班宝宝不开心啊,现在好了,RxJava来了,处理起来就不难了的。
登录代码如下
public void login(String phone, String password) { Observable.just(phone, password) .flatMap(new Func1<String, Observable<JSONObject>>() { @Override public Observable<JSONObject> call(String s) { try { JSONObject tokenJson = RxVolleyRequest.stringRequest(Request.Method.GET, "http://192.168.18.6:8080/token.json"); return Observable.just(tokenJson); } catch (Exception e) { e.printStackTrace(); } return Observable.error(new Exception("得到token错误")); } }).flatMap(new Func1<JSONObject, Observable<String>>() { @Override public Observable<String> call(JSONObject tokenJson) { try { if ("0".equals(tokenJson.getString("returnCode"))) { //同时你可以把信息的存取都放在这里的 JSONObject getUserInoo = RxVolleyRequest.stringRequest(Request.Method.GET, "http://192.168.18.6:8080/login.json"); return Observable.just("登录成功"); } else { return Observable.just("手机号没有注册过"); } } catch (Exception e) { e.printStackTrace(); } return Observable.error(new Exception("应用出现错误")); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onNext(String s) { if (s.equals("登录成功")) { Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show(); } else if (s.equals("手机号没有注册过")) { Intent intent = new Intent(MainActivity.this, RegActvity.class); startActivity(intent); } } }) ; }
注册模块
得到code
public void getCode(View v) { Observable.just("17051006632") .flatMap(new Func1<String, Observable<String>>() { @Override public Observable<String> call(String s) { try { JSONObject jsonObject = RxVolleyRequest.stringRequest(Request.Method.GET, "http://192.168.18.6:8080/getCode.json"); if ("0".equals(jsonObject.getString("returnCode"))) { //得到smscode return Observable.just(jsonObject.getString("code")); //{"returnCode":"0","code":"已发送"} } else { //调用得到code失败 return Observable.error(new Exception(jsonObject.getString("code")));//{"returnCode":"1","code":"获取失败!"} } } catch (Exception e) { e.printStackTrace(); } return Observable.error(new Exception("应用出现错误!")); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(RegActvity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onNext(String s) { Toast.makeText(RegActvity.this, s, Toast.LENGTH_SHORT).show(); } }) ; }
开始注册
public void reg(View v) { Observable.just("1705100226682", "1234") .flatMap(new Func1<String, Observable<String>>() { @Override public Observable<String> call(String s) { try { JSONObject tokenJson = RxVolleyRequest.stringRequest(Request.Method.GET, "http://192.168.18.6:8080/reg.json"); if ("0".equals(tokenJson.getString("returnCode"))) { return Observable.just("注册成功"); } else { return Observable.just("注册失败"); } } catch (Exception e) { e.printStackTrace(); } return Observable.error(new Exception("应用出现错误!")); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(RegActvity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onNext(String s) { if ("注册成功".equals(s)) { /* Intent intent = new Intent(RegActvity.this,AddUserInfoActivity.class); startActivity(intent); }*/ Toast.makeText(RegActvity.this, s, Toast.LENGTH_SHORT).show(); } } }); }
看到这里基本上已经完了的,是不是感觉逻辑很简单,不管是多个接口调用还是一些其它的逻辑,都变得很很简单,这才是我们编程的杀手剪。。。
相关文章推荐
- 码农小汪-SpringMVC-控制器详解2
- java中读取.properties配置文件
- 开个帖子记录一下自己学JAVA的历程
- Bellman-Ford算法-POJ1806-JAVA语言描述
- [Core Javascirpt] Basic Metaprogramming: Dynamic Method
- eclipse和myclipse编写xml文件,java自动提示功能
- web day22 文件上传,下载,JavaMail
- 20145104张家明 《Java程序设计》第9周学习总结
- 《JAVA程序设计》第九周学习总结
- Java高级之反射(一)
- JDK8 学习
- 转:Eclipse自动补全功能轻松设置
- 20145322《Java程序设计》第4次实验报告
- Java 反射 Reflection
- Java数组练习
- Vert.x 3 Core手册 for Java 中文版
- Java 自定义JDBC类库
- 跳表(Skip List)的JAVA实现
- Ubuntu 启动器/快捷方式/ 制作 (Eclipse为例)
- Java并发编程——线程安全及解决机制简介