在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. 基于稀疏表(Sparse Table)的RMQ(区间最值问题)

    在RMQ的其他实现方法中,有一种叫做ST的算法比较常见. [构建] dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值. ...

  2. [Jmeter] Jmeter Plugins

    Plugins: Plugins Manager: https://jmeter-plugins.org/wiki/PluginsManager/ Custom Thread Groups: http ...

  3. sqli-labs:1-4,基于报错的注入

    sqli1: 脚本 # -*- coding: utf-8 -*- """ Created on Sat Mar 23 09:37:14 2019 @author: ke ...

  4. 微信小程序获取当前位置

    详细参数说明请看小程序api文档:https://developers.weixin.qq.com/miniprogram/dev/api/wx.openLocation.html wx.getLoc ...

  5. 【UI测试】--易用性

  6. springMVC学习 七 视图解析器

    在springMVC中,如果不配置视图解析器,会走默认的视图解析器,但是有时候配置视图解析器,还有一定的作用 <bean id="viewResolver" class=&q ...

  7. linux下设置mysql表名不区分大小写

    原文:http://blog.csdn.net/johnsonvily/article/details/6703902 1.Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写: ...

  8. 69.查看APP沙盒缓存的内容文件

    第一步:链接真机设备,点击Xcode ,按command+shift+2  弹出电脑所运行的APP列表 第二步:选中你需要查看的APP,点击最下面! 类似于设置图标的按钮! 点击第二个Download ...

  9. Our Future

    The world is betting on how to win the football game: But I'm betting on how to win your heart: Mayb ...

  10. Amount of Degrees(数位dp)

    题目链接:传送门 思路:考虑二进制数字的情况,可以写成一个二叉树的形式,然后考虑区间[i……j]中满足的个数=[0……j]-[0……i-1]. 所以统计树高为i,中有j个1的数的个数. 对于一个二进制 ...