封装的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);
}
}
//-----------------------------------------
然后就可以直接使用了