您的位置:首页 > 理论基础 > 计算机网络

OKhttp二次封装

2017-11-22 19:36 363 查看

OKhttp工具类

public class OkhttpUtils {

private static OkhttpUtils okhttpUtils = null ;

private OkhttpUtils(){

}

public static OkhttpUtils getInstance(){

if(okhttpUtils == null){
okhttpUtils = new OkhttpUtils();
client = new OkHttpClient.Builder()
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.connectTimeout(20,TimeUnit.SECONDS)
//添加拦截器
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new UserAgentIntercepter())
.build();
}
return okhttpUtils ;

}

private static OkHttpClient client ;

/**
* 发起异步请求
* @param params
* @param url
* @param callBack
*/
public void asy(Map<String,String> params,String url,AbstractUiCallBack callBack){
Request request = null ;

if(params != null){
// post 请求
FormBody.Builder builder = new FormBody.Builder() ;
for(Map.Entry<String,String> entry : params.entrySet()){
builder.add(entry.getKey(),entry.getValue());
}
FormBody body =  builder.build();
request = new Request.Builder()
.url(url)
.post(body)
.build();
} else {
// get 请求
request = new Request.Builder()
.url(url)
.build();
}

client.newCall(request).enqueue(callBack);

}

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

public static void postFile(Map<String,String> map, String url, File file,AbstractUiCallBack callBack){

String [] array =  file.getAbsolutePath().split("\\/");

MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);

for(Map.Entry<String,String> entry : map.entrySet()){
builder.addFormDataPart(entry.getKey(),entry.getValue());
}
builder.addFormDataPart("imageFileName",array[array.length-1]);

if(file.exists() && file.length() > 0){
builder.addFormDataPart("image",array[array.length-1], RequestBody.create(MEDIA_TYPE_PNG,file));
}
MultipartBody body =  builder.build() ;

Request request = new Request.Builder()
.url(url)
.post(body)
.build();
client.newCall(request).enqueue(callBack);

}

}

回调类

public  abstract  class AbstractUiCallBack<T> implements Callback {

/**
* 成功回调
* @param t
*/
public abstract void success(T t);

/**
* 失败回调
* @param e
*/
public abstract void failure(Exception e);

private Handler handler = null ;
private Class clazz ;

public AbstractUiCallBack(){
handler = new Handler(Looper.getMainLooper());

//  得到的是一个 AbstractUiCallBack<T> 的Type
Type type =  getClass().getGenericSuperclass() ;

// 得到的是T的实际Type
Type [] arr =  ((ParameterizedType)type).getActualTypeArguments() ;

clazz = (Class) arr[0] ;

}

@Override
public void onFailure(Call call, IOException e) {

failure(e);

}

@Override
public void onResponse(Call call, Response response) throws IOException {

try {
String result = response.body().string();
System.out.println("result = " + result);
Gson gson = new Gson();

final T t = (T) gson.fromJson(result,clazz);

handler.post(new Runnable() {
@Override
public void run() {
success(t);
}
});
} catch (IOException e) {
e.printStackTrace();
failure(e);
} catch (JsonSyntaxException e) {
e.printStackTrace();
failure(e);
}

}
}

自定义拦截器

public class LoggingInterceptor implements Interceptor {

@Override public Response intercept(Chain chain) throws IOException {
//首先取到Request
Request request = chain.request();
Response response = null;
Request requestProcess = null ;
if("GET".equals(request.method())){
String url =  request.url().toString() + "&source=android";
Request.Builder builder =  request.newBuilder() ;
builder.get().url(url);
requestProcess =  builder.build();
response = chain.proceed(requestProcess);
} else {
FormBody.Builder builder = new FormBody.Builder() ;
RequestBody requestBody =  request.body() ;
if(requestBody instanceof FormBody){
FormBody formBody = (FormBody)requestBody ;
for (int i=0;i<formBody.size();i++){
builder.add(formBody.encodedName(i),formBody.encodedValue(i));
}
builder.add("source","android");
}
requestProcess =  request.newBuilder().url(re
4000
quest.url().toString()).post(builder.build()).build() ;
response = chain.proceed(requestProcess);
}

return response;
}
}

自定义拦截器

/**
* 添加请求头
*/
public class UserAgentIntercepter implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {

Request request =  chain.request().newBuilder()
.addHeader("key1","value")
.build();

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