当前位置:   article > 正文

OkHttp的一些封装_com.squareup.okhttp3与okio的依赖关系

com.squareup.okhttp3与okio的依赖关系


OkHttp的一些封装

 OkHttp3Utils封装方式一

okhttp3和okio的依赖
  compile 'com.squareup.okhttp3:okhttp:3.9.0'
    compile 'com.squareup.okio:okio:1.13.0'
 


  1. OkHttp3Utils
OkHttp3Utils
  1. 可以和OnUiCallback
  2. 结合使用
  3. import java.io.File;import java.io.IOException;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.MediaType;import okhttp3.MultipartBody;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import
  4. okhttp3.Response;public class OkHttp3Utils { private static OkHttpClient okHttpClient = null; public OkHttp3Utils() { } private static OkHttpClient getOkHttpClient() { synchronized (OkHttp3Utils.class) { if (okHttpClient == null) { okHttpClient = new OkHttpClient();
  5. } } return okHttpClient; } //上传文件 public static void loadFile(String url, File file,String fileName){ OkHttpClient okHttpClient = getOkHttpClient(); //设置文件类型 RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"),file); //设置请求体
  6. RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("image",fileName,requestBody) .build(); //请求方式 Request request = new Request.Builder().url(url).post(body).build(); okHttpClient.newCall(request).enqueue(new Callback()
  7. { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.i("成功","成功"); } }); } /** * 1.接口地址 * 2.接口回调 */ public static void doGet(String url,Callback callback){ OkHttpClient
  8. okHttpClient = getOkHttpClient(); Request request = new Request.Builder().url(url).build(); okHttpClient.newCall(request).enqueue(callback); } /** * 1.地址 * 2.接口回调 * 3.请求体 */ public static void doPost(String url, Map<String,String> map,Callback callback){ OkHttpClient
  9. okHttpClient = getOkHttpClient(); FormBody.Builder builder = new FormBody.Builder(); //遍历map集合 设置请求体 for (String mapKey : map.keySet()){ builder.add(mapKey,map.get(mapKey)); } //设置请求方式 Request request = new Request.Builder().url(url).post(builder.build()).build();
  10. //执行请求方式 接口回调 okHttpClient.newCall(request).enqueue(callback); } /** *1.下载地址 */ public static void doDown(String url,Callback callback){ OkHttpClient okHttpClient = getOkHttpClient(); Request build = new Request.Builder().url(url).build(); okHttpClient.newCall(build).enqueue(callback);
  11. }}
  12. OkHttp的封装方式二
  13.  
  14. OkHttpUtilsOkHttpUtils 可以和OnUiCallback
  15. 结合使用
  16. import android.os.Handler;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.OkHttpClient;import okhttp3.Request;public class OkHttpUtils { private Handler handler = new Handler(); public Handler getHandler(){
  17. return handler; } //单例 private static OkHttpUtils okHttpUtils = new OkHttpUtils(); private OkHttpUtils(){}; public static OkHttpUtils getInstance(){ return okHttpUtils; } private OkHttpClient client; // private OkHttpClient getOkHttpClient() { synchronized
  18. (OkHttpUtils.class) { if (client == null) { client = new OkHttpClient(); } } return client; } //公用的get请求方法 完成的功能不确定 public void doGet(String url, Callback callback){ OkHttpClient okHttpClient = getOkHttpClient(); Request request = new Request.Builder().url(url).build();
  19. Call call = okHttpClient.newCall(request); call.enqueue(callback); } public void doPost(String url, Map<String,String> map, Callback callback){ OkHttpClient okHttpClient = getOkHttpClient(); FormBody.Builder builder = new FormBody.Builder(); //遍历map集合 设置请求体
  20. for (String mapKey : map.keySet()){ builder.add(mapKey,map.get(mapKey)); } //设置请求方式 Request request = new Request.Builder().url(url).post(builder.build()).build(); //执行请求方式 接口回调 okHttpClient.newCall(request).enqueue(callback); } /** *1.下载地址 */ public void
  21. doDown(String url,Callback callback){ OkHttpClient okHttpClient = getOkHttpClient(); Request build = new Request.Builder().url(url).build(); okHttpClient.newCall(build).enqueue(callback); }}
  22. OkHttpUtils 可以和OnUiCallback
  23. 结合使用
  24. OnUiCallback
  25. import android.os.Handler;
  26. import java.io.IOException;
  27. import okhttp3.Call;
  28. import okhttp3.Callback;
  29. import okhttp3.Response;
  30. public abstract class OnUiCallback implements Callback{
  31.     private Handler handler = OkHttpUtils.getInstance().getHandler();
  32.     public abstract void onFailed(Call call, IOException e);
  33.     public abstract void onSuccess(String result) throws IOException;
  34.     @Override
  35.     public void onFailure(final Call call, final IOException e) {
  36.         //该方式  存在问题  网络请求也跑到了主线程   待解决
  37.         //该方法就是把  线程post到handler所在的线程
  38.         handler.post(new Runnable() {
  39.             @Override
  40.             public void run() {
  41.                 onFailed(call, e);
  42.             }
  43.         });
  44.     }
  45.     @Override
  46.     public void onResponse(final Call call, final Response response) throws IOException {
  47.         final String result = response.body().string();
  48.         //该方式  存在问题  网络请求也跑到了主线程   待解决
  49.         handler.post(new Runnable() {
  50.             @Override
  51.             public void run() {
  52.                 try {
  53.                     onSuccess(result);
  54.                 } catch (IOException e) {
  55.                     e.printStackTrace();
  56.                 }
  57.             }
  58.         });
  59.     }
  60. }
  61.  
  62.   封装了一些拦截器,但要导入一个依赖
  63. 封装了一些拦截器,但要导入一个依赖  compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
  64. Studio版本必须是2.1以上依赖才能使用此依赖 OkHttp3Utils
  65. import android.app.Activity;
  66. import android.content.Intent;
  67. import android.net.Uri;
  68. import android.os.Environment;
  69. import android.util.Log;
  70. import android.widget.Toast;
  71. import java.io.File;
  72. import java.io.FileOutputStream;
  73. import java.io.IOException;
  74. import java.io.InputStream;
  75. import java.util.Map;
  76. import java.util.concurrent.TimeUnit;
  77. import okhttp3.Cache;
  78. import okhttp3.Call;
  79. import okhttp3.Callback;
  80. import okhttp3.FormBody;
  81. import okhttp3.MediaType;
  82. import okhttp3.MultipartBody;
  83. import okhttp3.OkHttpClient;
  84. import okhttp3.Request;
  85. import okhttp3.RequestBody;
  86. import okhttp3.Response;
  87. import okhttp3.logging.HttpLoggingInterceptor;
  88. /**
  89. * 1. 类的用途 对OkHttp3二次封装 单例模式
  90. *
  91. */
  92. public class OkHttp3Utils {
  93. private static OkHttpClient okHttpClient = null;
  94. public OkHttp3Utils() {
  95. }
  96. //通过单例模式获取实例
  97. public static OkHttpClient getInstance() {
  98. if (okHttpClient == null) {
  99. //同步代码
  100. synchronized (OkHttp3Utils.class) {
  101. if (okHttpClient == null) {
  102. //缓存路径
  103. File sdcache = new File(Environment.getExternalStorageDirectory(), "wybcache");
  104. int cacheSize = 10 * 1024 * 1024;
  105. //okhttp拦截器
  106. HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
  107. @Override
  108. public void log(String message) {
  109. Log.i("msg", message.toString());
  110. }
  111. });
  112. //拦截器日志分类
  113. httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
  114. okHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.MINUTES)
  115. .addInterceptor(httpLoggingInterceptor)
  116. //.addNetworkInterceptor(null)
  117. .writeTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS)
  118. .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize)).build();
  119. //add
  120. }
  121. }
  122. }
  123. return okHttpClient;
  124. }
  125. /**
  126. * get请求方式
  127. *
  128. * @param url 请求地址
  129. * @param callback 回调接口
  130. */
  131. public static void doGet(String url, Callback callback) {
  132. //获取请求对象的实例
  133. OkHttpClient okHttpClient = OkHttp3Utils.getInstance();
  134. //创建Request
  135. Request request = new Request.Builder().url(url).build();
  136. //得到Call
  137. Call call = okHttpClient.newCall(request);
  138. //执行异步请求
  139. call.enqueue(callback);
  140. }
  141. /**
  142. * post请求方式
  143. *
  144. * @param url 请求地址
  145. * @param params 请求体
  146. * @param callback 接口回调
  147. */
  148. public static void doPost(String url, Map<String, String> params, Callback callback) {
  149. //获取请求对象的实例
  150. OkHttpClient okHttpClient = OkHttp3Utils.getInstance();
  151. //3.x版本post请求换成FormBody 封装键值对参数
  152. FormBody.Builder builder = new FormBody.Builder();
  153. //遍历map集合给请求体添加值
  154. for (String key : params.keySet()) {
  155. builder.add(key, params.get(key));
  156. }
  157. //创建Request
  158. Request request = new Request.Builder().url(url).post(builder.build()).build();
  159. //获取call
  160. Call call = okHttpClient.newCall(request);
  161. //异步请求
  162. call.enqueue(callback);
  163. }
  164. /**
  165. * 上传文件
  166. *
  167. * @param url 接口地址
  168. * @param file 文件
  169. * @param fileName 文件名
  170. */
  171. public static void loadFile(String url, File file, String fileName) {
  172. //创建OkHttpClient请求对象
  173. OkHttpClient okHttpClient = getInstance();
  174. //创建RequestBody 封装file参数
  175. RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
  176. //创建RequestBody 设置类型等
  177. RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", fileName, fileBody).build();
  178. //创建Request
  179. Request request = new Request.Builder().url(url).post(requestBody).build();
  180. Call call = okHttpClient.newCall(request);
  181. call.enqueue(new Callback() {
  182. @Override
  183. public void onFailure(Call call, IOException e) {
  184. }
  185. @Override
  186. public void onResponse(Call call, Response response) throws IOException {
  187. //请求成功
  188. }
  189. });
  190. }
  191. /**
  192. * 上传json字符
  193. *
  194. * @param url 接口地址
  195. * @param jsonParams Json串
  196. * @param callback 接口回调
  197. */
  198. public static void doPostJson(String url, String jsonParams, Callback callback) {
  199. RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);
  200. Request request = new Request.Builder().url(url).post(requestBody).build();
  201. Call call = getInstance().newCall(request);
  202. call.enqueue(callback);
  203. }
  204. /**
  205. * 下载
  206. *
  207. * @param context
  208. * @param url 下载地址
  209. * @param saveDir 保存的位置
  210. */
  211. public static void downFile(final Activity context, final String url, final String saveDir) {
  212. //创建Request
  213. Request request = new Request.Builder().url(url).build();
  214. //创建Call
  215. Call call = getInstance().newCall(request);
  216. //同步
  217. call.enqueue(new Callback() {
  218. @Override
  219. public void onFailure(Call call, IOException e) {
  220. Log.i("xxx", e.toString());
  221. }
  222. @Override
  223. public void onResponse(Call call, final Response response) throws IOException {
  224. InputStream is = null;
  225. byte[] buf = new byte[2048];
  226. int len = 0;
  227. FileOutputStream fos = null;
  228. try {
  229. is = response.body().byteStream();
  230. //apk保存路径
  231. final String fileDir = isExistDir(saveDir);
  232. //文件
  233. File file = new File(fileDir, getNameFromUrl(url));
  234. context.runOnUiThread(new Runnable() {
  235. @Override
  236. public void run() {
  237. Toast.makeText(context, "下载成功:" + fileDir + "," + getNameFromUrl(url), Toast.LENGTH_SHORT).show();
  238. }
  239. });
  240. fos = new FileOutputStream(file);
  241. while ((len = is.read(buf)) != -1) {
  242. fos.write(buf, 0, len);
  243. }
  244. fos.flush();
  245. //apk下载完成后 调用系统的安装方法
  246. Intent intent = new Intent(Intent.ACTION_VIEW);
  247. intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
  248. context.startActivity(intent);
  249. } catch (IOException e) {
  250. e.printStackTrace();
  251. } finally {
  252. if (is != null) is.close();
  253. if (fos != null) fos.close();
  254. }
  255. }
  256. });
  257. }
  258. /**
  259. * @param saveDir
  260. * @return
  261. * @throws IOException 判断下载目录是否存在
  262. */
  263. public static String isExistDir(String saveDir) throws IOException {
  264. // 下载位置
  265. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  266. File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);
  267. if (!downloadFile.mkdirs()) {
  268. downloadFile.createNewFile();
  269. }
  270. String savePath = downloadFile.getAbsolutePath();
  271. Log.e("savePath", savePath);
  272. return savePath;
  273. }
  274. return null;
  275. }
  276. /**
  277. * @param url
  278. * @return 从下载连接中解析出文件名
  279. */
  280. private static String getNameFromUrl(String url) {
  281. return url.substring(url.lastIndexOf("/") + 1);
  282. }
  283. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45646
推荐阅读
  

闽ICP备14008679号