在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. POJ 3621Sightseeing Cows 0/1 分数规划

    Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地 讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的 ...

  2. LibreOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配

    #6000. 「网络流 24 题」搭配飞行员 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  3. POJ 2014.K-th Number 区间第k小 (归并树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 57543   Accepted: 19893 Ca ...

  4. zz Alex's BLOG 串口连接

    using System; using System.Collections.Generic;using System.ComponentModel;using System.Data;using S ...

  5. c++11 template 模板练习

    直接上代码吧 to do // 111111.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...

  6. Redis (非关系型数据库) 数据类型 之 list列表类型

    Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边) list即可以作为“栈”也可以作为"队列". 操作: >lpush ...

  7. python学习 day22 (3月29日)----(生成器推导式)

    新手上路请多担待 1 2 封装 3 私有化封装 #__author : 'liuyang' #date : 2019/3/29 0029 上午 9:35 # 不想让别人看 修改 我的属性 # 源码来说 ...

  8. Python10/17-re模块/hashlib模块/logging模块

    import logging # 1.日志的级别# logging.debug("这是一个调试信息") # 10# logging.info("常规信息") # ...

  9. idea下启动tomcat时,打印的日志中文乱码

    idea2018.2+tomcat8+java8+win10 异常:将编码方式全都修改为UTF-8后,且tomcat的VM启动参数中配置了:-Dfile.encoding=UTF-8.导致控制台日志打 ...

  10. springboot 增加过滤器方法

    在访问服务器时,我们需要控制用户是否允许权限,这个时候可以使用过滤器. 在springboot 配置过滤器的方法如下: 编写过滤器代码: package com.neo.filter; import ...