RxJava + volley 实践

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代码

 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();
                        }
                    }
                });
    }

看到这里基本上已经完了的,是不是感觉逻辑很简单,不管是多个接口调用还是一些其它的逻辑,都变得很很简单,这才是我们编程的杀手剪。。。






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值