在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. Codeforces 787D. Legacy 线段树建模+最短路

    D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  2. MySQL学习笔记-大纲

    软件程序性能测试在之前<品味性能之道>系列中已经大量提到,讲解了很多测试方法.测试观念.测试思想等等.最近准备深入MySQL进行学习并总结.分别查阅<MySQL性能调优与架构设计&g ...

  3. Eloquent Attach/Detach/Sync Fires Any Event

    eloquent-attach-detach-sync-fires-any-event I have a laravel project, and I need to make some calcul ...

  4. Eigen中的map

    Map类用于通过C++中普通的连续指针或者数组 (raw C/C++ arrays)来构造Eigen里的Matrix类,这就好比Eigen里的Matrix类的数据和raw C++array 共享了一片 ...

  5. oracle导出expdp导入impdp

    conn sys/password as sysdba;创建用户test1CREATE USER test1 IDENTIFIED BY "pass1";GRANT CONNECT ...

  6. 几种开源的TCP/IP协议栈分析

    1:BSD TCP/IP协议栈,BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的.这是因为 BSD栈在BSD许可协议下提供了这些专业栈的 ...

  7. [C#.net]处理UTF-8文件乱码

    今天帮同事处理一个2M左右的文件的格式,发现使用Encoding.default & Encoding.UTF8 & Encoding.GetEncoding("GB2312 ...

  8. springMVC学习三 注解开发环境搭建

    第一步:导入jar包 第二步:配置DispatcherServlet  前端控制器 因为此处把DsipatcherServlet的映射路径配置成了"/",代表除了.jsp文件之外, ...

  9. 进制转换(NOIP2000&NOIP水题测试(2017082301))

    题目链接:进制转换 这题得明白其中的数学方法,明白后就不难了. 那么我们应该怎么计算呢? 其实也很简单. 我们依然采取辗转相除法. 但是,对于负的余数,我们需要进行一些处理. 我们怎么处理呢? 很简单 ...

  10. 2018.11.02 洛谷P2661 信息传递(拓扑排序+搜索)

    传送门 按照题意模拟就行了. 先拓扑排序去掉不在环上面的点. 剩下的都是简单环了. 于是都dfsdfsdfs一遍求出最短的环就行. 代码: #include<bits/stdc++.h> ...