OKhttp二次封装

来源:互联网 发布:画风好的h漫 知乎 编辑:程序博客网 时间:2024/06/05 04:44

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


原创粉丝点击