封装的OkHttp

封装的OkHttp 可以直接使用 包含了 同步异步的get。post请求,文件以及图片的操作

废话不多说 上代码

package com.example.okhttpmanager;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.ImageView;

import com.google.gson.Gson;
import com.google.gson.internal. G s o n Gson GsonTypes;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**

  • Created by hyj 2019 11 14
    */
    public class OkHttpClientManager {
    private static OkHttpClientManager mInstance;
    private OkHttpClient mOkHttpClient;
    private Handler mDelivery;
    private Gson mGson;

    private static final String TAG = “OkHttpClientManager”;

    @SuppressLint(“NewApi”)
    private OkHttpClientManager() {
    mOkHttpClient = new OkHttpClient();
    // cookie enabled
    mOkHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));
    mOkHttpClient.setConnectTimeout(30000, TimeUnit.SECONDS);
    mDelivery = new Handler(Looper.getMainLooper());
    mGson = new Gson();
    }

    public static OkHttpClientManager getInstance() {
    if (mInstance == null) {
    synchronized (OkHttpClientManager.class) {
    if (mInstance == null) {
    mInstance = new OkHttpClientManager();
    }
    }
    }
    return mInstance;
    }

    /**

    • 同步的Get请求
    • @param url
    • @return Response
      */
      private Response _getAsyn(String url) throws IOException {
      final Request request = new Request.Builder().url(url).build();
      Call call = mOkHttpClient.newCall(request);
      Response execute = call.execute();
      return execute;
      }

    /**

    • 同步的Get请求
    • @param url
    • @return 字符串
      */
      private String _getAsString(String url) throws IOException {
      Response execute = _getAsyn(url);
      return execute.body().string();
      }

    /**

    • 异步的get请求
    • @param url
    • @param callback
      */
      private void _getAsyn(String url, final ResultCallback callback) {
      final Request request = new Request.Builder().url(url).build();
      deliveryResult(callback, request);
      }

    /**

    • 同步的Post请求
    • @param url
    • @param params
    •        post的参数
      
    • @return
      */
      private Response _post(String url, Param… params) throws IOException {
      Request request = buildPostRequest(url, params);
      Response response = mOkHttpClient.newCall(request).execute();
      return response;
      }

    /**

    • 同步的Post请求
    • @param url
    • @param params
    •        post的参数
      
    • @return 字符串
      */
      private String _postAsString(String url, Param… params) throws IOException {
      Response response = _post(url, params);
      return response.body().string();
      }

    /**

    • 异步的post请求
    • @param url
    • @param callback
    • @param params
      */
      private void _postAsyn(String url, final ResultCallback callback, Param… params) {
      Request request = buildPostRequest(url, params);
      deliveryResult(callback, request);
      }

    /**

    • 异步的post请求
    • @param url
    • @param callback
    • @param params
      */
      private void _postAsyn(String url, final ResultCallback callback, Map<String, String> params) {
      Param[] paramsArr = map2Params(params);
      Request request = buildPostRequest(url, paramsArr);
      deliveryResult(callback, request);
      }

    /**

    • 同步基于post的文件上传
    • @param params
    • @return
      */
      private Response _post(String url, File[] files, String[] fileKeys, Param… params) throws IOException {
      Request request = buildMultipartFormRequest(url, files, fileKeys, params);
      return mOkHttpClient.newCall(request).execute();
      }

    private Response _post(String url, File file, String fileKey) throws IOException {
    Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, null);
    return mOkHttpClient.newCall(request).execute();
    }

    private Response _post(String url, File file, String fileKey, Param… params) throws IOException {
    Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, params);
    return mOkHttpClient.newCall(request).execute();
    }

    /**

    • 异步基于post的文件上传
    • @param url
    • @param callback
    • @param files
    • @param fileKeys
    • @throws IOException
      */
      private void _postAsyn(String url, ResultCallback callback, File[] files, String[] fileKeys, Param… params)
      throws IOException {
      Request request = buildMultipartFormRequest(url, files, fileKeys, params);
      deliveryResult(callback, request);
      }

    /**

    • 异步基于post的文件上传,单文件不带参数上传
    • @param url
    • @param callback
    • @param file
    • @param fileKey
    • @throws IOException
      */
      private void _postAsyn(String url, ResultCallback callback, File file, String fileKey) throws IOException {
      Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, null);
      deliveryResult(callback, request);
      }

    /**

    • 异步基于post的文件上传,单文件且携带其他form参数上传
    • @param url
    • @param callback
    • @param file
    • @param fileKey
    • @param params
    • @throws IOException
      */
      private void _postAsyn(String url, ResultCallback callback, File file, String fileKey, Param… params)
      throws IOException {
      Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, params);
      deliveryResult(callback, request);
      }

    /**

    • 异步下载文件

    • @param url

    • @param destFileDir

    •        本地文件存储的文件夹
      
    • @param callback
      */
      private void _downloadAsyn(final String url, final String destFileDir, final ResultCallback callback) {
      final Request request = new Request.Builder().url(url).build();
      final Call call = mOkHttpClient.newCall(request);
      call.enqueue(new Callback() {
      @Override
      public void onFailure(final Request request, final IOException e) {
      sendFailedStringCallback(request, e, callback);
      }

       @Override
       public void onResponse(Response response) {
       	InputStream is = null;
       	byte[] buf = new byte[2048];
       	int len = 0;
       	FileOutputStream fos = null;
       	try {
       		is = response.body().byteStream();
       		File file = new File(destFileDir, getFileName(url));
       		fos = new FileOutputStream(file);
       		while ((len = is.read(buf)) != -1) {
       			fos.write(buf, 0, len);
       		}
       		fos.flush();
       		// 如果下载文件成功,第一个参数为文件的绝对路径
       		sendSuccessResultCallback(file.getAbsolutePath(), callback);
       	} catch (IOException e) {
       		sendFailedStringCallback(response.request(), e, callback);
       	} finally {
       		try {
       			if (is != null)
       				is.close();
       		} catch (IOException e) {
       		}
       		try {
       			if (fos != null)
       				fos.close();
       		} catch (IOException e) {
       		}
       	}
      
       }
      

      });
      }

    private String getFileName(String path) {
    int separatorIndex = path.lastIndexOf("/");
    return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1, path.length());
    }

    /**

    • 加载图片

    • @param view

    • @param url

    • @throws IOException
      */
      private void _displayImage(final ImageView view, final String url, final int errorResId) {
      final Request request = new Request.Builder().url(url).build();
      Call call = mOkHttpClient.newCall(request);
      call.enqueue(new Callback() {
      @Override
      public void onFailure(Request request, IOException e) {
      setErrorResId(view, errorResId);
      }

       @Override
       public void onResponse(Response response) {
       	InputStream is = null;
       	try {
       		is = response.body().byteStream();
       		ImageUtils.ImageSize actualImageSize = ImageUtils.getImageSize(is);
       		ImageUtils.ImageSize imageViewSize = ImageUtils.getImageViewSize(view);
       		int inSampleSize = ImageUtils.calculateInSampleSize(actualImageSize, imageViewSize);
       		try {
       			is.reset();
       		} catch (IOException e) {
       			response = _getAsyn(url);
       			is = response.body().byteStream();
       		}
      
       		BitmapFactory.Options ops = new BitmapFactory.Options();
       		ops.inJustDecodeBounds = false;
       		ops.inSampleSize = inSampleSize;
       		final Bitmap bm = BitmapFactory.decodeStream(is, null, ops);
       		mDelivery.post(new Runnable() {
       			@Override
       			public void run() {
       				view.setImageBitmap(bm);
       			}
       		});
       	} catch (Exception e) {
       		setErrorResId(view, errorResId);
      
       	} finally {
       		if (is != null)
       			try {
       				is.close();
       			} catch (IOException e) {
       				e.printStackTrace();
       			}
       	}
       }
      

      });

    }

    private void setErrorResId(final ImageView view, final int errorResId) {
    mDelivery.post(new Runnable() {
    @Override
    public void run() {
    view.setImageResource(errorResId);
    }
    });
    }

    // *对外公布的方法

    public static Response getAsyn(String url) throws IOException {
    return getInstance()._getAsyn(url);
    }

    public static String getAsString(String url) throws IOException {
    return getInstance()._getAsString(url);
    }

    public static void getAsyn(String url, ResultCallback callback) {
    getInstance()._getAsyn(url, callback);
    }

    public static Response post(String url, Param… params) throws IOException {
    return getInstance()._post(url, params);
    }

    public static String postAsString(String url, Param… params) throws IOException {
    return getInstance()._postAsString(url, params);
    }

    public static void postAsyn(String url, final ResultCallback callback, Param… params) {
    getInstance()._postAsyn(url, callback, params);
    }

    public static void postAsyn(String url, final ResultCallback callback, Map<String, String> params) {
    getInstance()._postAsyn(url, callback, params);
    }

    public static Response post(String url, File[] files, String[] fileKeys, Param… params) throws IOException {
    return getInstance()._post(url, files, fileKeys, params);
    }

    public static Response post(String url, File file, String fileKey) throws IOException {
    return getInstance()._post(url, file, fileKey);
    }

    public static Response post(String url, File file, String fileKey, Param… params) throws IOException {
    return getInstance()._post(url, file, fileKey, params);
    }

    public static void postAsyn(String url, ResultCallback callback, File[] files, String[] fileKeys, Param… params)
    throws IOException {
    getInstance()._postAsyn(url, callback, files, fileKeys, params);
    }

    public static void postAsyn(String url, ResultCallback callback, File file, String fileKey) throws IOException {
    getInstance()._postAsyn(url, callback, file, fileKey);
    }

    public static void postAsyn(String url, ResultCallback callback, File file, String fileKey, Param… params)
    throws IOException {
    getInstance()._postAsyn(url, callback, file, fileKey, params);
    }

    public static void displayImage(final ImageView view, String url, int errorResId) throws IOException {
    getInstance()._displayImage(view, url, errorResId);
    }

    public static void displayImage(final ImageView view, String url) {
    getInstance()._displayImage(view, url, -1);
    }

    public static void downloadAsyn(String url, String destDir, ResultCallback callback) {
    getInstance()._downloadAsyn(url, destDir, callback);
    }

    // ****************************

    private Request buildMultipartFormRequest(String url, File[] files, String[] fileKeys, Param[] params) {
    params = validateParam(params);

     MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
    
     for (Param param : params) {
     	builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + param.key + "\""),
     			RequestBody.create(null, param.value));
     }
     if (files != null) {
     	RequestBody fileBody = null;
     	for (int i = 0; i < files.length; i++) {
     		File file = files[i];
     		String fileName = file.getName();
     		fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
     		// TODO 根据文件名设置contentType
     		builder.addPart(Headers.of("Content-Disposition",
     				"form-data; name=\"" + fileKeys[i] + "\"; filename=\"" + fileName + "\""), fileBody);
     	}
     }
    
     RequestBody requestBody = builder.build();
     return new Request.Builder().url(url).post(requestBody).build();
    

    }

    private String guessMimeType(String path) {
    FileNameMap fileNameMap = URLConnection.getFileNameMap();
    String contentTypeFor = fileNameMap.getContentTypeFor(path);
    if (contentTypeFor == null) {
    contentTypeFor = “application/octet-stream”;
    }
    return contentTypeFor;
    }

    private Param[] validateParam(Param[] params) {
    if (params == null)
    return new Param[0];
    else
    return params;
    }

    private Param[] map2Params(Map<String, String> params) {
    if (params == null)
    return new Param[0];
    int size = params.size();
    Param[] res = new Param[size];
    Set<Map.Entry<String, String>> entries = params.entrySet();
    int i = 0;
    for (Map.Entry<String, String> entry : entries) {
    res[i++] = new Param(entry.getKey(), entry.getValue());
    }
    return res;
    }

    private static final String SESSION_KEY = “Set-Cookie”;
    private static final String mSessionKey = “JSESSIONID”;

    private Map<String, String> mSessions = new HashMap<String, String>();

    private void deliveryResult(final ResultCallback callback, Request request) {
    mOkHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(final Request request, final IOException e) {
    sendFailedStringCallback(request, e, callback);
    Log.e(“OkHttpClientManager”, “onFailure===z” + request.toString());

     	}
    
     	@Override
     	public void onResponse(final Response response) {
     		try {
     			final String string = response.body().string();
     			Log.e("OkHttpClientManager", "onResponse===" + response.toString());
     			Log.e("OkHttpClientManager", "json===" + string.toString());
     			if (callback.mType == String.class) {
     				sendSuccessResultCallback(string, callback);
     			} else {
     				Object o = mGson.fromJson(string, callback.mType);
     				sendSuccessResultCallback(o, callback);
     			}
    
     		} catch (IOException e) {
     			sendFailedStringCallback(response.request(), e, callback);
     		} catch (com.google.gson.JsonParseException e)// Json解析的错误
     		{
     			sendFailedStringCallback(response.request(), e, callback);
     		}
    
     	}
     });
    

    }

    private void sendFailedStringCallback(final Request request, final Exception e, final ResultCallback callback) {
    mDelivery.post(new Runnable() {
    @Override
    public void run() {
    if (callback != null)
    callback.onError(request, e);
    }
    });
    }

    private void sendSuccessResultCallback(final Object object, final ResultCallback callback) {
    mDelivery.post(new Runnable() {
    @Override
    public void run() {
    if (callback != null) {
    callback.onResponse(object);
    }
    }
    });
    }

    private Request buildPostRequest(String url, Param[] params) {
    if (params == null) {
    params = new Param[0];
    }
    FormEncodingBuilder builder = new FormEncodingBuilder();
    for (Param param : params) {
    builder.add(param.key, param.value);
    }
    RequestBody requestBody = builder.build();
    return new Request.Builder().url(url).post(requestBody).build();
    }

    public static abstract class ResultCallback {
    Type mType;

     public ResultCallback() {
     	mType = getSuperclassTypeParameter(getClass());
     }
    
     static Type getSuperclassTypeParameter(Class<?> subclass) {
     	Type superclass = subclass.getGenericSuperclass();
     	if (superclass instanceof Class) {
     		throw new RuntimeException("Missing type parameter.");
     	}
     	ParameterizedType parameterized = (ParameterizedType) superclass;
     	return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
     }
    
     public abstract void onError(Request request, Exception e);
    
     public abstract void onResponse(T response);
    

    }

    public static class Param {
    public Param(String id, int i) {
    }

     public Param(String key, String value) {
     	this.key = key;
     	this.value = value;
     }
    
     String key;
     String value;
    

    }

}

如果需要图片操作 在导入

package com.example.okhttpmanager;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;

public class ImageUtils
{

public static ImageSize getImageSize(InputStream imageStream) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(imageStream, null, options);
    return new ImageSize(options.outWidth, options.outHeight);
}

public static class ImageSize {
    int width;
    int height;

    public ImageSize() {
    }

    public ImageSize(int width, int height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public String toString() {
        return "ImageSize{" +
                "width=" + width +
                ", height=" + height +
                '}';
    }
}

public static int calculateInSampleSize(ImageSize srcSize, ImageSize targetSize) {
    int width = srcSize.width;
    int height = srcSize.height;
    int inSampleSize = 1;

    int reqWidth = targetSize.width;
    int reqHeight = targetSize.height;

    if (width > reqWidth && height > reqHeight) {
        int widthRatio = Math.round((float) width / (float) reqWidth);
        int heightRatio = Math.round((float) height / (float) reqHeight);
        inSampleSize = Math.max(widthRatio, heightRatio);
    }
    return inSampleSize;
}

public static ImageSize getImageViewSize(View view) {

    ImageSize imageSize = new ImageSize();

    imageSize.width = getExpectWidth(view);
    imageSize.height = getExpectHeight(view);

    return imageSize;
}

private static int getExpectHeight(View view) {
    int height = 0;
    if (view == null) return 0;
    final ViewGroup.LayoutParams params = view.getLayoutParams();
    if (params != null && params.height != ViewGroup.LayoutParams.WRAP_CONTENT) {
        height = view.getWidth();
    }
    if (height <= 0 && params != null) {

         height = params.height;
    }

    if (height <= 0) {
        height = getImageViewFieldValue(view, "mMaxHeight");
    }

    if (height <= 0) {
        DisplayMetrics displayMetrics = view.getContext().getResources()
                .getDisplayMetrics();
        height = displayMetrics.heightPixels;
    }

    return height;
}

private static int getExpectWidth(View view) {
    int width = 0;
    if (view == null) return 0;

    final ViewGroup.LayoutParams params = view.getLayoutParams();
    if (params != null && params.width != ViewGroup.LayoutParams.WRAP_CONTENT) {
        width = view.getWidth();
    }
    if (width <= 0 && params != null) {
        width = params.width;
    }

    if (width <= 0) {
        width = getImageViewFieldValue(view, "mMaxWidth");
    }
    if (width <= 0) {
        DisplayMetrics displayMetrics = view.getContext().getResources()
                .getDisplayMetrics();
        width = displayMetrics.widthPixels;
    }

    return width;
}

private static int getImageViewFieldValue(Object object, String fieldName) {
    int value = 0;
    try {
        Field field = ImageView.class.getDeclaredField(fieldName);
        field.setAccessible(true);
        int fieldValue = field.getInt(object);
        if (fieldValue > 0 && fieldValue < Integer.MAX_VALUE) {
            value = fieldValue;
        }
    } catch (Exception e) {}
    return value;

}
// 根据路径获得图片并压缩,返回bitmap用于显示
public static Bitmap getSmallBitmap(String filePath) {
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, 480, 800);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(filePath, options);
}

//计算图片的缩放值
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        final int heightRatio = Math.round((float) height/ (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
}


//把bitmap转换成String
public static String bitmapToString(String filePath) {
    Bitmap bm = getSmallBitmap(filePath);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    //1.5M的压缩后在100Kb以内,测试得值,压缩后的大小=94486字节,压缩后的大小=74473字节
    //这里的JPEG 如果换成PNG,那么压缩的就有600kB这样
    bm.compress(Bitmap.CompressFormat.JPEG, 40, baos);
    byte[] b = baos.toByteArray() ;
    Log.d("d", "压缩后的大小=" + b.length);
    return Base64.encodeToString(b, Base64.DEFAULT);
}
//把bitmap转换成String
public static String bitmapToString2(Bitmap bm ) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    //1.5M的压缩后在100Kb以内,测试得值,压缩后的大小=94486字节,压缩后的大小=74473字节
    //这里的JPEG 如果换成PNG,那么压缩的就有600kB这样
    bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] b = baos.toByteArray();
    Log.d("d", "压缩后的大小=" + b.length);
    return Base64.encodeToString(b, Base64.DEFAULT);
}

}

//-----------------------------------------
然后就可以直接使用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值