Android中okhttp的基本用法2(okHttp的简单封装)
来源:互联网 发布:网络攒钱 编辑:程序博客网 时间:2024/05/05 08:54
1.开网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2.所需要的jar包
gson-2.2.4.jar
okhttp-2.5.0.jar
okio-1.6.0.jar
导入jar包并和项目关联
3.分装类OkHttpClientManager
<span style="font-size:18px;">package android.test.com.okhttp1;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Handler;import android.os.Looper;import android.widget.ImageView;import com.google.gson.Gson;import com.google.gson.internal.$Gson$Types;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;/** * Created by Administrator on 2016/4/13. */public class OkHttpClientManager{ private static OkHttpClientManager mInstance; private OkHttpClient mOkHttpClient; private Handler mDelivery; private Gson mGson; private static final String TAG = "OkHttpClientManager"; private OkHttpClientManager() { mOkHttpClient = new OkHttpClient(); //cookie enabled mOkHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER)); 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 * @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 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()); } private void setErrorResId(final ImageView view, final int errorResId) { mDelivery.post(new Runnable() { @Override public void run() { view.setImageResource(errorResId); } }); } //*************对外公布的方法************ /** 异步的get请求 * * @param url * @param callback */ public static void getAsyn(String url, ResultCallback callback) { getInstance()._getAsyn(url, callback); } public static void postAsyn(String url, final ResultCallback callback, Param... params) { getInstance()._postAsyn(url, callback, params); } /** * 异步的post请求 * @param url * @param callback * @param 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 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); } @Override public void onResponse(final Response response) { try { final String string = response.body().string(); 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<T> { 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() { } public Param(String key, String value) { this.key = key; this.value = value; } String key; String value; }}</span>
4.MainActivity中调用
<span style="font-size:18px;">/** * 分装基本完成 * */public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);// mygetObjectjson();// mypostObjectjson(); mygetFuZaObjectjson(); }
<pre name="code" class="java"> /** * 封装后get的使用 * 已测试 */ private void myGet(){ OkHttpClientManager.getAsyn("https://www.baidu.com", new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(String u) {// 主线程 Log.e("1", "返回数据:" + u); } }); } /** * 分装后的post请求 * 已测试 * */ private void myPost(){// 设置参数 Map<String,String> map = new HashMap<String,String>(); map.put("type", "1");// 请求 OkHttpClientManager.postAsyn("http://112.124.22.238:8081/course_api/banner/query", new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { Log.e("1", "" + response.toString()); } }, map); } /** * get * 整合json解析json[] * 已测试 */ private void mygetArrayjson(){ OkHttpClientManager.getAsyn("http://112.124.22.238:8081/course_api/banner/query?type=1", new OkHttpClientManager.ResultCallback<List<Entity>>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(List<Entity> entitity) { Log.e("TAG", entitity.size() + ""); for (int i = 0; i < entitity.size(); i++) { Log.e("1", "" + entitity.get(i).getName().toString()); } } }); } /** * get * 整合json解析{} * 已测试 */ private void mygetObjectjson(){ OkHttpClientManager.getAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1&q=牛", new OkHttpClientManager.ResultCallback<Cow>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(Cow cow) {// 主线程 Log.e("1", "" + cow.getQuery()); } }); } /** * post * 整合json解析json[] * 已测试 */ private void mypostArrayjson(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("type", "1"); // 请求 OkHttpClientManager.postAsyn("http://112.124.22.238:8081/course_api/banner/query", new OkHttpClientManager.ResultCallback<List<Entity>>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(List<Entity> entitity) { for (int i = 0; i < entitity.size(); i++) { Log.e("1", "" + entitity.get(i).getName().toString()); } } }, map); } /** * post * 整合json解析object{} * 已测试 */ private void mypostObjectjson(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("q", "牛"); // 请求 OkHttpClientManager.postAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1", new OkHttpClientManager.ResultCallback<Cow>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(Cow cow) { Log.e("1",cow.getQuery()); } }, map); } /** * 解析复杂数据 * 和解析一个对象是一样的,只是在javaBean中改变即可 */ private void mygetFuZaObjectjson(){ OkHttpClientManager.getAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1&q=牛", new OkHttpClientManager.ResultCallback<JsonBean>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(JsonBean jsonBean) { List<JsonBean.Web> web = jsonBean.web; for (JsonBean.Web webData : web) { String webDataStr=webData.key; Log.e("1",webDataStr); } } }); } /** * 文件上传且携带参数 * 我们希望提供一个方法,传入url,params,file,callback即可。 * 未测试 */// private void upLoaderFile(){// OkHttpClientManager.postAsyn("http://192.168.1.103:8080/okHttpServer/fileUpload",//// new OkHttpClientManager.ResultCallback<String>()// {//// @Override// public void onError(Request request, Exception e) {//// }//// @Override// public void onResponse(String result)// {//// }// },//// file,//// "mFile",//// new OkHttpClientManager.Param[]{// new OkHttpClientManager.Param("username", "zhy"),// new OkHttpClientManager.Param("password", "123")}// );//// } /** * 文件下载 * 对于文件下载,提供url,目标dir,callback即可。 * 未测试 */ private void downLoader(){ OkHttpClientManager.downloadAsyn( "http://192.168.1.103:8080/okHttpServer/files/messenger_01.png", Environment.getExternalStorageDirectory().getAbsolutePath(), new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { //文件下载成功,这里回调的reponse为文件的absolutePath } }); }
}
<pre style="font-family: 宋体; font-size: 12pt; background-color: rgb(255, 255, 255);">
5.所需要的javaBean
Entity
<span style="font-size:18px;">public class Entity {// "id": 1,// "name": "音箱狂欢",// "description": null,// "imgUrl": "http://7mno4h.com2.z0.glb.qiniucdn.com/5608f3b5Nc8d90151.jpg",// "type": 1 private String id; private String name; private String description; private String imgUrl; private String type; public Entity(){ } public Entity(String id, String name, String description, String imgUrl, String type) { this.id = id; this.name = name; this.description = description; this.imgUrl = imgUrl; this.type = type; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public String getType() { return type; } public void setType(String type) { this.type = type; }}</span>Cow
<span style="font-size:18px;">public class Cow { private String query; public String getQuery() { return query; } public void setQuery(String query) { this.query = query; }}</span>JsonBean
<span style="font-size:18px;">public class JsonBean { public String query; public List<Web> web; public static class Web { public String key; }}</span>
源码及jar包下载:
http://download.csdn.net/detail/zhaihaohao1/9490986
参考文章:
http://blog.csdn.net/lmj623565791/article/details/47911083
0 0
- Android中okhttp的基本用法2(okHttp的简单封装)
- Android中okhttp的基本用法1
- Android OkHttp的基本用法
- okhttp的简单封装
- OkHttp的简单封装
- okhttp的简单封装
- 简单的封装okhttp
- OKHTTP的简单封装
- okhttp的简单封装
- 简单的okhttp封装
- 简单的封装Okhttp
- 简单的封装okhttp
- OKHttp的基本使用和简单封装
- Android中okhttp的基本用法1的基础上进行封装
- Android OkHttp的封装
- OKHttp的简单用法
- OkHttp的简单用法
- Android中okhttp网络请求的封装
- Java Web项目如何读取.properties配置文件
- android带样式文字的实现
- OpenCV中对图像数据进行64F和8U转换的方法
- 原生指针 泛型指针 智能指针 都是什么?
- Windbg本机调试时“your debugger is not using the correct symbols”错误
- Android中okhttp的基本用法2(okHttp的简单封装)
- 多个分类重名时,方法的调用顺序
- android数据交互之Handler Message消息机制
- Android中关于Volley的使用(六)认识 CacheDispatcher
- Android初学习 - 遍历Bundle的内容
- 计算机网络之TCP/IP协议(网络通讯协议)
- Java编译后生成带$符号的class
- 关于PullToRefresh的setOnTouchListener()无效的问题。
- android6.0 adbd深入分析(四)adbd usb线拔掉再连接的过程