在AndroidManifest.xml配置网络访问权限:

   <!-- 访问网络是危险的行为 所以需要权限 -->
<uses-permission android:name="android.permission.INTERNET" />

在 app/build.gradle 加入

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

  然后点击 sync now 下载okhttp支持包

OKHttpEngine

package liudeli.async.okhttp;

import android.util.Log;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response; /**
* @Author Liudeli
* @Describe:网络请求相关的引擎
*/
public class OKHttpEngine { private final String TAG = OKHttpEngine.class.getSimpleName(); /**
* 单例模式
*/
private static OKHttpEngine engine;
public static OKHttpEngine getInstance() { if (null == engine) { synchronized (OKHttpEngine.class) { if (null == engine) {
engine = new OKHttpEngine();
}
}
}
return engine;
} private OKHttpEngine(){} private OkHttpClient client = new OkHttpClient(); /**
* Http Get 请求
* [属于同步方法,使用需要加子线程]
* @param url
* @return
* @throws IOException
*/
public String httpGetResult(String url) throws IOException { Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
} /**
* Http Post 请求
* [属于同步方法,使用需要加子线程]
* @param url
* @return
* @throws IOException
*/
public String httpPostResult(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
} /***************************** 以下属于JSON请求想的代码了 **********************************/ public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); /**
* 联调成功方法 postJsonRequest
* [属于同步方法,使用需要加子线程,此方法内部已经加入子线程]
* @param url
* @param stringJSON
*/
public void postJsonRequest(final String url, final String stringJSON, final MyOKHttpCallback callback) {
new Thread() { @Override
public void run() {
super.run(); try {
RequestBody body = RequestBody.create(JSON, stringJSON); Request request = new Request.Builder()
.url(url)
.post(body)
.build(); Response response = client.newCall(request).execute(); String result = response.body().string(); Log.d(TAG, "请求结果信息 result:" + result); callback.result(result); } catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "postJsonRequest e:" + e.getMessage());
callback.result("error");
}
}
}.start();
} /**
* Post请求,请求的数据是JSON,异步方法,不需要加入子线程
* @param url
* @param stringJSON
*/
public void postJSONRequest(String url, String stringJSON, Callback callback) {
try { RequestBody body = RequestBody.create(JSON, stringJSON); Request request = new Request.Builder()
.url(url)
.post(body)
.build(); Call call = client.newCall(request); // 使用client去请求 call.enqueue(callback); // 回调方法,>>> 可以获得请求结果信息 } catch (Exception e) {
e.printStackTrace();
}
}
}

MyOKHttpCallback

package liudeli.async.okhttp;

/**
* @Author Liudeli
* @Describe:ost、Get 普通请求所用到的接口回调接口
*/
public abstract class MyOKHttpCallback { /**
* 一般是用于,Post、Get 普通请求所用到的接口回调方法
* 异步请求暂时用不到,因为异步用专门的回调方法
* @param result
*/
public abstract void result(String result);
}

MyActivity 使用 okhttp

package liudeli.async.okhttp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View; import org.json.JSONObject; import java.io.IOException; import liudeli.async.R;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response; public class MyActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_my);
} /**
* 中国天气网地址:http://www.weather.com.cn
*/
private final String PATH1 = "http://www.weather.com.cn/data/sk/101110101.html";
private final String PATH2 = "http://www.weather.com.cn/data/sk/101110101.html";
private final String PATH3 = "http://www.weather.com.cn/data/sk/101110101.html";
private final String PATH4 = "http://www.weather.com.cn/data/sk/101110101.html"; /**
* 普通Http Get 请求
* @param view
*/
public void request1(View view) {
final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); new Thread(){ @Override
public void run() {
super.run(); try {
String result = okHttpEngine.httpGetResult(PATH1);
Log.d("@@@", "普通Http Get 请求 响应结果:" + result);
} catch (IOException e) {
e.printStackTrace();
} }
}.start(); } /**
* 普通Http Get 请求
* @param view
*/
public void request2(View view) {
final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); new Thread(){ @Override
public void run() {
super.run(); try {
String result = okHttpEngine.httpPostResult(PATH2);
Log.d("@@@", "普通Http Post 请求 响应结果:" + result);
} catch (IOException e) {
e.printStackTrace();
} }
}.start();
} /**
* Post请求JSON数据1
* @param view
*/
public void request3(View view) {
final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); /**
* 这里的JSON jsonString 到底有何用:
*
* 例如:以前我在公司做项目的时候,每次请求时,需要传输请求头信息给>>>服务器
* 请求头信息,是公司内部需要的请求头信息,是服务器规定的
* JSONObject jsonHeader = new JSONObject();
* jsonHeader.put("serviceCode", serviceCode);
* jsonHeader.put("channelCode", channelCode);
* jsonHeader.put("osType", onType);
* jsonHeader.put("appVersion", appVersion);
* jsonHeader.put("rocket", rocket);
* jsonHeader.put("requestTime", requestTime);
* ....
*
* String jsonString =jsonHeader..toString();
*/ /**
* 这里的JSON jsonString 到底有何用:
*
* 例如:以前我在公司做项目的时候,每次请求时,需要传输参数给>>>服务器
* 参数信息,是公司内部需要的参数信息,是服务器规定的
* JSONObject jsonParam = new JSONObject();
* jsonParam.put("param1", param1);
* jsonParam.put("param2", param2);
* jsonParam.put("param3", param3);
* jsonParam.put("param4", param4);
* jsonParam.put("param5", param5);
* jsonParam.put("param6", param6);
*
* String jsonString = jsonParam.toString();
*/ try {
JSONObject jsonParam = new JSONObject();
/*jsonParam.put("param1", "");
jsonParam.put("param2", "");
jsonParam.put("param3", "");
jsonParam.put("param4", "");
jsonParam.put("param5", "");
jsonParam.put("param6", "");*/ // 注意⚠️:jsonString = null 当RequestBody.create(JSON, stringJSON);时会报错
String jsonString = null /*jsonParam.toString()*/ ; okHttpEngine.postJsonRequest(PATH3, jsonString, new MyOKHttpCallback() { @Override
public void result(String result) {
Log.d("@@@", "Post请求JSON数据1 响应结果:" + result);
}
}); }catch (Exception e) {
e.printStackTrace();
} } /**
* Post请求JSON数据2 - okhttp异步
* @param view
*/
public void request4(View view) {
final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); /**
* 这里的JSON jsonString 到底有何用:
*
* 例如:以前我在公司做项目的时候,每次请求时,需要传输请求头信息给>>>服务器
* 请求头信息,是公司内部需要的请求头信息,是服务器规定的
* JSONObject jsonHeader = new JSONObject();
* jsonHeader.put("serviceCode", serviceCode);
* jsonHeader.put("channelCode", channelCode);
* jsonHeader.put("osType", onType);
* jsonHeader.put("appVersion", appVersion);
* jsonHeader.put("rocket", rocket);
* jsonHeader.put("requestTime", requestTime);
* ....
*
* String jsonString =jsonHeader..toString();
*/ /**
* 这里的JSON jsonString 到底有何用:
*
* 例如:以前我在公司做项目的时候,每次请求时,需要传输参数给>>>服务器
* 参数信息,是公司内部需要的参数信息,是服务器规定的
* JSONObject jsonParam = new JSONObject();
* jsonParam.put("param1", param1);
* jsonParam.put("param2", param2);
* jsonParam.put("param3", param3);
* jsonParam.put("param4", param4);
* jsonParam.put("param5", param5);
* jsonParam.put("param6", param6);
*
* String jsonString = jsonParam.toString();
*/ try {
JSONObject jsonParam = new JSONObject();
/*jsonParam.put("param1", "");
jsonParam.put("param2", "");
jsonParam.put("param3", "");
jsonParam.put("param4", "");
jsonParam.put("param5", "");
jsonParam.put("param6", "");*/ // 注意⚠️:jsonString = null 当RequestBody.create(JSON, stringJSON);时会报错
String jsonString = null; /*jsonParam.toString()*/ ; okHttpEngine.postJSONRequest(PATH4, jsonString, new Callback() { @Override
public void onFailure(Call call, IOException e) {
Log.d("@@@", "call.toString:" + call.toString());
} @Override
public void onResponse(Call call, Response response) throws IOException {
// 获得网络数据
String result = response.body().string();
Log.d("@@@", "响应成功 call.toString:" + call.toString() + " result:" + result);
} }); }catch (Exception e) {
e.printStackTrace();
}
}
}

activity_my.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="普通Http Get 请求"
android:onClick="request1"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="普通Http Post 请求"
android:onClick="request2"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Post请求JSON数据1"
android:onClick="request3"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Post请求JSON数据2 - okhttp异步"
android:onClick="request4"
/> </LinearLayout>

由于只有中国天气网地址:http://www.weather.com.cn ,所以不能对这个天气网服务器传参数(JSON jsonString),所以后面两个按钮就不点击测试了,它们是

Android-okhttp的更多相关文章

  1. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  2. Android okHttp网络请求之Get/Post请求

    前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...

  3. Android okHttp网络请求之文件上传下载

    前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...

  4. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  5. Android okHttp网络请求之Retrofit+Okhttp+RxJava组合

    前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...

  6. Android OkHttp完全解析 --zz

    参考文章 https://github.com/square/okhttp http://square.github.io/okhttp/ 泡网OkHttp使用教程 Android OkHttp完全解 ...

  7. Android OkHttp完全解析 是时候来了解OkHttp了

    Android OkHttp完全解析 是时候来了解OkHttp了 标签: AndroidOkHttp 2015-08-24 15:36 316254人阅读 评论(306) 收藏 举报  分类: [an ...

  8. Android OkHttp文件上传与下载的进度监听扩展

    http://www.loongwind.com/archives/290.html 上一篇文章介绍了用Retrofit实现文件的上传与下载,但是我们发现没办法监听上传下载的进度,毕竟我们在做开发的时 ...

  9. Android OkHttp与物理存储介质缓存:DiskLruCache(2)

     Android OkHttp与物理存储介质缓存:DiskLruCache(2) 本文在附录文章8,9的基础之上,把Android OkHttp与DiskLruCache相结合,综合此两项技术,实 ...

  10. Android OkHttp(1)

     Android OkHttp(1) OkHttp是一个流行的第三方开源网络请求框架,在目前的一些APP开发中比较流行.Android平台开源的网络请求框架不少,比如常见的Volley, Asyn ...

随机推荐

  1. Ionic学习

    1. 原来Http不能直接加在普通类里,下面的报错 import { Component } from '@angular/core'; import { NavController } from ' ...

  2. 纯H5+c3实现表单验证

    客户端验证是网页客户端程序最常用的功能之一,我们之前使用了各种各样的js库来进行表单的验证.HTML5其实早已为我们提供了表单验证的功能.至于为啥没有流行起来估计是兼容性的问题还有就是样式太丑陋了吧. ...

  3. Java中TreeMap的基本操作

    TreeSet有四种种构造函数可以初始化 在代码中主要列出了常用的三种: 构造方法摘要 TreeSet()           构造一个新的空 set,该 set 根据其元素的自然顺序进行排序. Tr ...

  4. Ubuntu显示实时网速CPU内存等参数

    添加库 sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor 更新软件列表 sudo apt-get update 安装indica ...

  5. js-day02

    1.数据类型转换2.函数3.分支结构*******************************1.数据类型转换 数据类型:number,string,boolean,null,undefined ...

  6. Codeforces 1103 简要题解(持续更新)

    文章目录 A题 B题 C题 D题 传送门 又一场原地爆炸的比赛. A题 传送门 简单思维题 题意:给一个4∗44*44∗4的格子图和一个01串,你要根据01串放1∗21*21∗2的木块,如果是0就竖放 ...

  7. 2018.11.09 bzoj4773: 负环(倍增+floyd)

    传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...

  8. 证明抛物线焦点发出的光线经y=ax^2反射后平行于y轴

  9. jquery删除onclick属性和设置onclick属性--获取验证码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. shell脚本之正则表达式

    具体参考: www.jb51.net/tools/shell_regex.html 正则表达式常用于grep AWK 等工具中