复制 参考某大佬写的,感谢大佬
build.gradle配置
implementation 'com.squareup.okhttp3:okhttp:3.14.4'
implementation 'com.squareup.okio:okio:1.17.2'
implementation 'com.google.code.gson:gson:2.8.6'
AndroidManifest.xml添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
代码如下
public class GeRequestRry {
private OkHttpClient client;
private Request.Builder request;
private FormBody.Builder requestBody;
private Gson gson;
private Class aClass;
private Handler handler;
private int connectTimeout = 15;
private int readTimeout = 10;
private RequestType type;
private static GeRequestRry requestRry;
public static GeRequestRry getInstance() {
if (requestRry == null){
synchronized (GeRequestRry.class){
if (requestRry == null){
requestRry = new GeRequestRry();
}
}
}
return requestRry;
}
private GeRequestRry(){
gson = new Gson();
handler = new Handler();
client = new OkHttpClient.Builder()
.connectTimeout(connectTimeout, TimeUnit.SECONDS)
.readTimeout(readTimeout,TimeUnit.SECONDS)
.build();
}
/**
* 请求类型
*/
public enum RequestType{
GET,POST
}
/**
* 请求类型
* @param type
* @return
*/
public GeRequestRry create(RequestType type){
if (type == RequestType.POST)
requestBody = new FormBody.Builder();
this.type = type;
request = new Request.Builder();
return this;
}
/**
* 映射实体类
* @param aClass
* @return
*/
public GeRequestRry setMapClass(Class aClass){
this.aClass = aClass;
return this;
}
/**
* 请求Url
* @param url
* @return
*/
public GeRequestRry url(String url){
if (request == null){//不闪退一下都不知道自己哪错了
throw new NullPointerException("请求为空 ==> 没写create方法");
}
request.url(url);
return this;
}
/**
* 添加参数
* @param key
* @param value
* @return
*/
public GeRequestRry add(String key, String value){
requestBody.add(key,value);
return this;
}
/**
* 构建
* @param result
*/
public void build(OnResponse result){
if (type == RequestType.GET){
get(result);
}else if (type == RequestType.POST){
post(result);
}
}
private void get(OnResponse result){
client.newCall(request.get().build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
clear();
handler.post(new Runnable() {
@Override
public void run() {
result.fail(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
clear();
handler.post(new Runnable() {
@Override
public void run() {
//可能发生实体类转换异常
try{
int code = response.code();
if (code == 200){
String data = response.body().string();
if (aClass != null){
result.success(gson.fromJson(data,aClass));
}else {
result.success(data);
}
}else {
result.fail(code);
}
}catch (Exception e){
result.fail(e);
}
}
});
}
});
}
private void post(OnResponse result){
client.newCall(request.post(requestBody.build()).build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
clear();
handler.post(new Runnable() {
@Override
public void run() {
result.fail(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
clear();
handler.post(new Runnable() {
@Override
public void run() {
//可能发生实体类转换异常
try{
int code = response.code();
if (code == 200){
String data = response.body().string();
if (aClass != null){
result.success(gson.fromJson(data,aClass));
}else {
result.success(data);
}
}else {
result.fail(code);
}
}catch (Exception e){
result.fail(e);
}
}
});
}
});
}
private void clear(){
request = null;
if (requestBody != null)
requestBody = null;
}
public interface OnResponse<A>{
void success(A a);
void fail(Exception e);
void fail(int code);
}
}
GET请求如下
GeRequestRry.getInstance().create(GeRequestRry.RequestType.GET)
.url("https://www.xxx.com")
//如果不想转换实体类就写String
.build(new GeRequestRry.OnResponse<String>() {
@Override
public void success(String o) {
Log.e(TAG,o);
}
@Override
public void fail(Exception e) {
Log.e(TAG,e.getMessage());
}
@Override
public void fail(int code) {
Log.e(TAG,"Error code = "+code);
}
});
POST请求如下
GeRequestRry.getInstance().create(GeRequestRry.RequestType.POST)
.url("https://www.xxxxxx.com/api")
.add("key","value")//添加请求参数
.setMapClass(KS.class)//设置要转化的实体类
.build(new GeRequestRry.OnResponse<KS>() {
@Override
public void success(KS o) {
Log.d(TAG,o.getErrmsg());
}
@Override
public void fail(Exception e) {
Log.e(TAG,e.getMessage());
}
@Override
public void fail(int code) {
Log.e(TAG,"Error code = "+code);
}
});
如需其他请求方式或其他功能请自行添加
2019.12.31 略微改动:回调方法运行在主线程 设置工具类为单例