java okhttp3 工具类,Retrofit+okhttp+Rxjava网络请求工具类
1.BaseApis接口封装请求方式
package com.example.wdshop.network;
import java.util.Map;
import okhttp3.ResponseBody;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.PartMap;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
import rx.Observable;
public interface BaseApis {
/**
* Observable被观察者
* */
@GET
Observable get(@Url String url);
@POST
Observable post(@Url String url, @QueryMap Map map);
@Multipart
@POST
Observable postFormBody(@Url String url, @PartMap Map requestBodyMap);
}
2.RetrofitManager工具类
package com.example.wdshop.network;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class RetrofitManager {
private final String BASE_URL = "http://172.17.8.100/small/";
private static RetrofitManager instance;
private final BaseApis baseApis;
//单例
public static RetrofitManager getInstance() {
if (instance == null) {
synchronized (RetrofitManager.class) {
instance = new RetrofitManager();
}
}
return instance;
}
//无参构造
public RetrofitManager() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(10, TimeUnit.SECONDS);
builder.writeTimeout(10, TimeUnit.SECONDS);
builder.connectTimeout(10, TimeUnit.SECONDS);
builder.addInterceptor(interceptor);
builder.retryOnConnectionFailure(true);
OkHttpClient build = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.client(build)
.build();
baseApis = retrofit.create(BaseApis.class);
}
/**
* 可以这样生成Map requestBodyMap
* Map requestDataMap这里面放置上传数据的键值对。
*/
public Map generateRequestBody(Map requesrDataMap) {
Map requestBodyMap = new HashMap<>();
for (String key : requesrDataMap.keySet()) {
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"),
requesrDataMap.get(key) == null ? "" : requesrDataMap.get(key));
requestBodyMap.put(key, requestBody);
}
return requestBodyMap;
}
/**
* get
*/
public RetrofitManager get(String url,HttpListener listener) {
baseApis.get(url)
//后台执行在哪个线程
.subscribeOn(Schedulers.io())
//最终完成后执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())
//设置rxjava
.subscribe(getObserver(listener));
return instance;
}
/**
* 观察者
*/
private Observer getObserver(final HttpListener listener) {
Observer observer = new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (listener != null) {
listener.onFail(e.getMessage());
}
}
@Override
public void onNext(ResponseBody responseBody) {
try {
String data = responseBody.string();
if (null != listener) {
listener.onSuccess(data);
}
} catch (IOException e) {
e.printStackTrace();
if (listener != null) {
listener.onFail(e.getMessage());
}
}
}
};
return observer;
}
/**
* 表单post请求
*/
public RetrofitManager postFormBody(String url, Map map,HttpListener listener) {
if (map == null) {
map = new HashMap<>();
}
baseApis.postFormBody(url,map)
//后台执行在哪个线程
.subscribeOn(Schedulers.io())
//最终完成后执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())
//设置rxjava
.subscribe(getObserver(listener));
return instance;
}
/**
* 普通post
* */
public RetrofitManager post(String url,Map map,HttpListener listener){
if(map == null){
map = new HashMap<>();
}
baseApis.post(url,map)
// 后台执行在哪个线程
.subscribeOn(Schedulers.io())
//最终完成后执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())
//设置rxjava
.subscribe(getObserver(listener));
return instance;
}
//创建观察者
public interface HttpListener {
void onSuccess(String data);
void onFail(String error);
}
}
3.view层接口
package com.example.wdshop.view;
public interface Iview {
void requestData(E e);
void requestFail(E e);
}
4.presenter层接口
package com.example.wdshop.presents;
import java.util.Map;
public interface Ipresenter {
//post请求
void startRequest(String url, Map map, Class clazz);
//get请求
void getRequest(String url,Class clazz);
}
5.p层实现类
package com.example.wdshop.presents;
import com.example.wdshop.model.ModelImpl;
import com.example.wdshop.model.MyCallBack;
import com.example.wdshop.view.Iview;
import java.util.Map;
public class PresenterImpl implements Ipresenter {
private Iview mIview;
private ModelImpl model;
public PresenterImpl(Iview iview) {
mIview = iview;
model = new ModelImpl();
}
/**
* post
* */
@Override
public void startRequest(String url, Map map, Class clazz) {
model.requestData(url, map, clazz, new MyCallBack() {
@Override
public void onSuccess(Object data) {
mIview.requestData(data);
}
@Override
public void onFail(String error) {
mIview.requestFail(error);
}
});
}
/**
* get
* */
@Override
public void getRequest(String url, Class clazz) {
model.requestGet(url, clazz, new MyCallBack() {
@Override
public void onSuccess(Object data) {
mIview.requestData(data);
}
@Override
public void onFail(String error) {
mIview.requestFail(error);
}
});
}
public void onDetach(){
if (model!=null){
model = null;
}
if(mIview!=null){
mIview = null;
}
}
}
6.MyCallBack接口用于从m层向v层传数据
package com.example.wdshop.model;
public interface MyCallBack {
void onSuccess(E data);
void onFail(String error);
}
7.m层接口
package com.example.wdshop.model;
import java.util.Map;
public interface Imodel {
/**
* post
* */
void requestData(String url, Map map, Class clazz, MyCallBack myCallBack);
/**
* get
* */
void requestGet(String url,Class clazz, MyCallBack myCallBack);
}
8.m层实现类
package com.example.wdshop.model;
import com.example.wdshop.network.RetrofitManager;
import com.google.gson.Gson;
import java.util.Map;
public class ModelImpl implements Imodel {
private MyCallBack myCallBack;
/**
* post
* */
@Override
public void requestData(String url, final Map map, final Class clazz, final MyCallBack myCallBack) {
this.myCallBack = myCallBack;
RetrofitManager.getInstance().post(url,map,new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
try {
Object o = new Gson().fromJson(data, clazz);
if(myCallBack!=null){
myCallBack.onSuccess(o);
}
}catch (Exception e){
e.printStackTrace();
if(myCallBack!=null){
myCallBack.onFail(e.getMessage());
}
}
}
@Override
public void onFail(String error) {
if(myCallBack!=null){
myCallBack.onFail(error);
}
}
});
}
/**
* get
* */
@Override
public void requestGet(String url, final Class clazz, final MyCallBack myCallBack) {
RetrofitManager.getInstance().get(url,new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
try {
Object o = new Gson().fromJson(data, clazz);
if(myCallBack!=null){
myCallBack.onSuccess(o);
}
}catch (Exception e){
e.printStackTrace();
if(myCallBack!=null){
myCallBack.onFail(e.getMessage());
}
}
}
@Override
public void onFail(String error) {
if(myCallBack!=null){
myCallBack.onFail(error);
}
}
});
}
}
java okhttp3 工具类,Retrofit+okhttp+Rxjava网络请求工具类相关推荐
- Rxjava+retrofit+okHttp+mvp网络请求数据
//Api类 public class Api {//http://api.svipmovie.com/front/columns/getVideoList.do?catalogId=40283481 ...
- java中使用okhttpsoap,Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
Retrofit介绍: Retrofit和okHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库,Retrofit简化了网络请求流程,基于OkHtttp做了封装,解耦的更彻底:比 ...
- Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架
目录 1.什么是MVP? 2.什么是Retrofit? 3.RxJava 4.实践 之前公司的项目用到了MVP+Retrofit+RxJava的框架进行网络请求,所以今天特此写一篇文章以做总结.相信很 ...
- Retrofit+OKHttp+RxJava的使用
什么是响应式编程 响应式编程是一种基于异步数据 流概念的编程模式.数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一 条流合并为一条新的流. 什么是RxJava RxJava ...
- android搭建网络框架,Android 搭建MVP+Retrofit+RxJava网络请求框架(三)
上一篇中主要是将mvp+rxjava+retrofit进行了结合,本篇主要是对mvp框架的优化:建议先去看上一篇:Android 搭建MVP+Retrofit+RxJava网络请求框架(二) 针对vi ...
- Kotlin使用Coroutine+ViewModel+retrofit构建一个网络请求框架
Kotlin使用Coroutine+ViewModel+retrofit构建一个网络请求框架 公司里的老代码用的网络请求框架技术都比较老,为了快速搭建一个网络请求框架,提高工作效率,记录一下用jetp ...
- 从源码处理一理Retrofit的异步网络请求如何把结果切换到主线程
前提,需要具备的知识点是:动态代理,反射,注解. 场景:某日面试的时候被问道,Retrofit异步网络请求是怎么把结果返回给主线程的? 答曰:具体原理不是很清楚,最后应该是通过handler把结果发送 ...
- request 网络请求工具
/*** request 网络请求工具* @Doc: https://github.com/umijs/umi-request*/ import { clearAuthority } from '@/ ...
- Okhttp网络请求工具介绍
1.Okhttp请求流程: Okhttp内部的大致请求流程图如下所示: 使用方式: public class OkHttpUtils {private static String TAG = &quo ...
最新文章
- php mysql cms 商城,国内最常用的PHP+MySql免费CMS系统大全
- java中channelmessage,MessagePack在Netty中的应用
- Python continue
- python整商运算符_python中的运算符
- spring boot ---- jpa连接和操作mysql数据库
- log4j:WARN Please initialize the log4j system properly.解决方案
- TC软件概要设计文档(手机群控)
- Linux系统查看内存使用情况
- Access update语句 提示 操作必须使用一个可更新的查询
- Kelihos荣升恶意软件之王
- Java——事故应急
- 如何使用robots.txt及其详解
- IDEA全局替换快捷键
- 程序员微信名昵称_推荐几个高逼格的微信昵称?
- sd卡无法完成格式化解决办法
- 恭喜腾佑当选“河南省企业上云推进联盟”理事单位!
- 批量将jpg格式图像改为png格式
- MFC设置应用程序图标
- Android WebView 的回退方法(goback) 遭遇重定向
- LeetCode340:至多包含 K 个不同字符的最长子串(python)
热门文章
- 【华为云技术分享】Entity Framework Core 捕获数据库变动
- 【华为敏捷/DevOps实践】4. 如何从Excel做项目管理的方式中走出来
- php的floorval函数,php 取整函数(floor,ceil,round,intval)_PHP教程
- gui界面如何和内核链接 python_专栏 | 除了内核程序,Abaqus还能这样做二次开发...
- html 修改按回退键的url,location.hash保存页面状态的技巧
- Mac软件损坏,无法打开,允许任何来源后依旧损坏
- M1芯片Mac使用原生brew安装软件速度过慢的解决办法
- m1芯片macbook安装torch环境(采用conda-forge)
- Mac中使用LaTeX的中文字体出现Package fontspec Error: The font “宋体“ cannot be found.解决方案
- Python引用任意位置模块方法总结