您的位置:首页 > 编程语言 > Java开发

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

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: