Android 单例模式 封装 Okhttp + RxJava 网络请求(get和post)
2017-12-12 10:57
489 查看
用过Retrofit的小伙伴都知道,当Retrofit和RxJava结合使用的时候,我们需要在定义Api的接口中的请求方法的返回值设置成一个带有解析实体类泛型的Observable
下面Rxjava和Okhttp结合使用
导入依赖:
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
下面是网络工具类,关键位置有注释
public class NetTool {
private static OkHttpClient okHttpClient;
private static NetTool instance;
private NetTool() {
okHttpClient = new OkHttpClient();
}
//单例双重锁线程安全
public static NetTool getInstance() {
if (instance == null) {
synchronized (NetTool.class) {
if (instance == null) {
instance = new NetTool();
}
}
}
return instance;
}
//get请求 声明泛型 括号里传入网址和实体类
public <T> Observable<T> request(final String url, final Class<T> clazz) {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(url);
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
//参数里的s是onNext方法传递过来的url
Request request = new Request.Builder().url(s).build();
Response respose = okHttpClient.newCall(request).execute();
//然后请求成功后响应的String数据继续对其map转换
//在下个map转换中进行Json解析
return respose.body().string();
}
}).map(new Function<String, T>() {
@Override
public T apply(String s) throws Exception {
Gson gson = new Gson();
T t = gson.fromJson(s,clazz);
return t;
}
});
}
//post 提交键值对
public <T> Observable<T> postKeyValue (final String baseurl, final Map<String,String> map, final Class<T> clazz) {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(baseurl);
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
//参数里的s是onNext方法传递过来的baseurl
FormBody.Builder builder = new FormBody.Builder();
//遍历map 添加多个参数进入请求体
Set<String> keyset = map.keySet();
Iterator<String> keyIterator = keyset.iterator();
while (keyIterator.hasNext()){
String key = keyIterator.next();
builder.add(key,map.get(key));
}
//生成请求体
RequestBody requestBody= builder.build();
Request request = new Request.Builder().url(s).post(requestBody).build();
Response response = okHttpClient.newCall(request).execute();
return response.body().string();
}
}).map(new Function<String, T>() {
@Override
public T apply(String s) throws Exception {
Gson gson = new Gson();
T t = gson.fromJson(s,clazz);
return t;
}
});
}
//post携带json数据请求
public <T> Observable<T> postJsonstr (final String baseUrl , final Class<T> clazz, final String json){
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(baseUrl);
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, json);
Request request = ne
4000
w Request.Builder()
.url(baseUrl)
.post(body)
.build();
Response response = okHttpClient.newCall(request).execute();
return response.body().string();
}
}).map(new Function<String, T>() {
@Override
public T apply(String s) throws Exception {
Gson gson = new Gson();
T t = gson.fromJson(s,clazz);
return t;
}
});
}
}
下面是调用代码
//get请求应用
NetTool.getInstance()
.request("http://gank.io/api/data/%E7%A6%8F%E5%88%A9/50/1", PictureBean.class)
.subscribeOn(Schedulers.io())//指定之前被观察者的动作在io线程中操作
.observeOn(AndroidSchedulers.mainThread())//将被观察者返回的数据切换到主线程中
.subscribe(new Consumer<PictureBean>() {
@Override
public void accept(PictureBean pictureBean) throws Exception {
//请求成功,并在子线程完成了解析,返回了实体类
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//异常
}
});
下面Rxjava和Okhttp结合使用
导入依赖:
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
下面是网络工具类,关键位置有注释
public class NetTool {
private static OkHttpClient okHttpClient;
private static NetTool instance;
private NetTool() {
okHttpClient = new OkHttpClient();
}
//单例双重锁线程安全
public static NetTool getInstance() {
if (instance == null) {
synchronized (NetTool.class) {
if (instance == null) {
instance = new NetTool();
}
}
}
return instance;
}
//get请求 声明泛型 括号里传入网址和实体类
public <T> Observable<T> request(final String url, final Class<T> clazz) {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(url);
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
//参数里的s是onNext方法传递过来的url
Request request = new Request.Builder().url(s).build();
Response respose = okHttpClient.newCall(request).execute();
//然后请求成功后响应的String数据继续对其map转换
//在下个map转换中进行Json解析
return respose.body().string();
}
}).map(new Function<String, T>() {
@Override
public T apply(String s) throws Exception {
Gson gson = new Gson();
T t = gson.fromJson(s,clazz);
return t;
}
});
}
//post 提交键值对
public <T> Observable<T> postKeyValue (final String baseurl, final Map<String,String> map, final Class<T> clazz) {
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(baseurl);
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
//参数里的s是onNext方法传递过来的baseurl
FormBody.Builder builder = new FormBody.Builder();
//遍历map 添加多个参数进入请求体
Set<String> keyset = map.keySet();
Iterator<String> keyIterator = keyset.iterator();
while (keyIterator.hasNext()){
String key = keyIterator.next();
builder.add(key,map.get(key));
}
//生成请求体
RequestBody requestBody= builder.build();
Request request = new Request.Builder().url(s).post(requestBody).build();
Response response = okHttpClient.newCall(request).execute();
return response.body().string();
}
}).map(new Function<String, T>() {
@Override
public T apply(String s) throws Exception {
Gson gson = new Gson();
T t = gson.fromJson(s,clazz);
return t;
}
});
}
//post携带json数据请求
public <T> Observable<T> postJsonstr (final String baseUrl , final Class<T> clazz, final String json){
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext(baseUrl);
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, json);
Request request = ne
4000
w Request.Builder()
.url(baseUrl)
.post(body)
.build();
Response response = okHttpClient.newCall(request).execute();
return response.body().string();
}
}).map(new Function<String, T>() {
@Override
public T apply(String s) throws Exception {
Gson gson = new Gson();
T t = gson.fromJson(s,clazz);
return t;
}
});
}
}
下面是调用代码
//get请求应用
NetTool.getInstance()
.request("http://gank.io/api/data/%E7%A6%8F%E5%88%A9/50/1", PictureBean.class)
.subscribeOn(Schedulers.io())//指定之前被观察者的动作在io线程中操作
.observeOn(AndroidSchedulers.mainThread())//将被观察者返回的数据切换到主线程中
.subscribe(new Consumer<PictureBean>() {
@Override
public void accept(PictureBean pictureBean) throws Exception {
//请求成功,并在子线程完成了解析,返回了实体类
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//异常
}
});
//post键值对请求 Map<String,String> postMap = new HashMap<>(); postMap.put("username","louyulin"); postMap.put("password","123456"); NetTool.getInstance() .postKeyValue("http://...",postMap,PictureBean.ResultsBean.class) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<PictureBean.ResultsBean>() { @Override public void accept(PictureBean.ResultsBean resultsBean) throws Exception { } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { } });
相关文章推荐
- Android okHttp网络请求之Get/Post请求(一)
- Android okHttp网络请求之Get/Post请求
- Android okHttp网络请求之Get/Post请求
- android 网络请求Retrofit+rxjava+okhttp 轻封装
- Android好用的okhttp网络封装(get,post,上传,下载)
- Android okHttp 实战(一):okHttp网络请求之Get/Post请求
- Android----------OkHttp网络请求框架Get和Post简单封装(泛型)
- Android RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- Android好用的okhttp网络封装(get,post,上传,下载)
- Android-封装post和get 网络请求
- Android okHttp网络请求之Get/Post请求
- Android 单例模式封装 RxJava+Retrofit 网络请求
- Android 网络请求框架,包涵get,post请求,from表单上传图片,基于okhtt封装的图片上传
- 封装OKHttp的get和post请求模版
- OkHttp get post请求的封装
- Android网络框架-Volley(四) 使用get和post方法发送json请求
- OkHttp请求封装(Get Post Delete Put请求)异步和同步(请求头)请求的封装
- Android中Okhttp进行get和post提交及数据请求的基本使用
- OkHttp3封装,可链式调用,目前包括post,get,上传、下载文件,及https请求加证书
- Android中使用HttpURLConnection和HttpClient实现GET和POST请求访问网络