一、官方Demo(授人以鱼不如授人以渔,点击进入官网,然后看我们的Demo)
- 官网已经说了一个是通过GET的方式访问URL并用返回String内容
- 还说了通过POST方式把数据提交给服务器
二、OkHttp使用
官方使用demo讲了GET和POST两种方式,我们来说说同步和异步两种使用方式。
1. jar包依赖
//MAVEN
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>(insert latest version)</version>
</dependency>
//GRADLE
implementation 'com.squareup.okhttp3:okhttp:(insert latest version)'
//如下我的实例版本号:3.6.0
implementation 'com.squareup.okhttp3:okhttp:3.6.0'
当然你肯定还需要在清单文件下面加入对应的网络权限,可能还会用到读写权限。
2. OkHttp访问URL(同步和异步)
package com.mma.dj.downloaddemo.all.helper;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
public class OkhttpHelper {
private static OkHttpClient mOkHttpClient;
/**
* 静态内部类,实例化对象使用
*/
private static class SingletonOkhttpHelper {
private static final OkhttpHelper INSTANCE = new OkhttpHelper();
}
/**
* 对外唯一实例的接口
*
* @return
*/
public static OkhttpHelper getInstance() {
return SingletonOkhttpHelper.INSTANCE;
}
/**
* 初始化OKHttpClient
*/
public OkHttpClient initOkHttpClient(){
if (mOkHttpClient == null) {
synchronized (OkhttpHelper.class) {
if (mOkHttpClient == null) {
mOkHttpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build();
return mOkHttpClient;
}
}
}
return mOkHttpClient;
}
}
- 创建OkHttpUtils类(网络访问工具类 包括同步:会堵塞当前线程,所以要新起线程访问,响应结果如果要更新UI也需要在UI线程进行操作;异步:已经封装有子线程,返回结果如果要更新UI,必须在UI线程操作,可以用Handler、EventBus、或者其他观察者模式)
public class OkHttpUtils {
private final OkHttpClient okHttpClient ;
private File file;
/**
* 静态内部类,实例化对象使用
*/
private static class SingletonOkhttpUtils {
private static final OkHttpUtils INSTANCE = new OkHttpUtils();
}
/**
* 同步
* 对外唯一实例的接口
*
* @return
*/
public static OkHttpUtils getInstance() {
return SingletonOkhttpUtils.INSTANCE;
}
/**
* 构造方法初始化OkHttpClient
*/
public OkHttpUtils() {
this.okHttpClient = OkhttpHelper.getInstance().initOkHttpClient();
}
/**
* @param url 下载地址
* @return InputStream
*/
public InputStream OkHttp2InputStream(String url){
//设置请求
Request request = new Request.Builder()
.url(url)
.build();
InputStream is = null;
try {
//获取行响应
Response response = okHttpClient.newCall(request).execute();
if(response.code() == 200){
is = response.body().byteStream();
}
} catch (IOException e) {
return null;
}
return is;
}
/**
* 同步
* @param url 访问地址
* @return String
*/
public String OkHttp2String(String url){
//设置请求
Request request = new Request.Builder()
.url(url)
.build();
//返回结果
String result = null;
try {
Response response = okHttpClient.newCall(request).execute();
if(response.code() == 200){
result = response.body().string();
}
} catch (IOException e) {
return null;
}
return result;
}
/**
* @param url 访问地址
* @param requestBody 请求参数
* @param headers 请求头
* @return String
*/
public String OkHttp2String(String url, RequestBody requestBody, Headers headers){
//设置 请求
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.headers(headers)
.build();
//获取行响应
String result = null;
try {
result = okHttpClient.newCall(request).execute().body().string();
} catch (IOException e) {
return null;
}
return result;
}
/**
* 异步
* 下载文件,支持断点下载
* @param url 下载地址
*/
private static final String savePath = "/sdcard/app/";
public void OkHttp2Sava(final String url , final DownLoadInterface loadInterface ,final String appName){
Request request = new Request.Builder()
.url(url)
.build();
//使用异步请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
loadInterface.downLoadFail("下载失败");
}
@Override
public void onResponse(Call call, Response response) {
//文件输出流
FileOutputStream fos = null;
//输入流
InputStream is = null;
//输入流缓存
BufferedInputStream bis = null;
//文件总长度
long totalLength ;
//判断是否挂载
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return ;
}
File save = new File(savePath);
if (!save.exists()) {
//创建目录
save.mkdir();
}
file = new File(savePath + appName + ".apk");
try {
if (!file.exists()) {