1、添加okhttp引用
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
2、新建一个请求接口
public interface INetManager {
// 异步get
void get(String url,INetCallBack callBack);
// 同步get
void get(String url,GetCallBack netCallBack) throws IOException;
// 同步post
Response post(String url, Map<String,String> bodyParams) throws IOException;
// 异步post
void post(String url, Map<String,String> bodyParams,Map<String,String> headersParams,INetCallBack callBack);
}
3、get和post异步请求响应接口
public interface INetCallBack {
void success(String response);
void failed(Throwable throwable);
}
3.1、get同步请求响应接口
public interface GetCallBack {
void success(Response response);
void failed(Throwable throwable);
}
4、新建一个网络管理类
public class OkHttpINetManager implements INetManager {
// 绑定ui线程
private static Handler sHandler=new Handler(Looper.getMainLooper());
private static OkHttpClient sOkhttpClient;
static {
OkHttpClient.Builder builder=new OkHttpClient.Builder();
builder.readTimeout(30, TimeUnit.SECONDS);//读取超时
builder.connectTimeout(10, TimeUnit.SECONDS);//连接超时
builder.writeTimeout(60, TimeUnit.SECONDS);//写入超时
sOkhttpClient = builder.build();
// TrustManagerFactory trustManagerFactory = null;
// try {
// trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// trustManagerFactory.init((KeyStore) null);
// TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
// if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
// throw new IllegalStateException("Unexpected default trust managers:"
// + Arrays.toString(trustManagers));
// }
// X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
// SSLContext sslContext = SSLContext.getInstance("TLS");
// sslContext.init(null, new TrustManager[] { trustManager }, null);
// SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
// builder.sslSocketFactory(sslSocketFactory,trustManager);
// builder.hostnameVerifier(new HostnameVerifier() {
// @Override
// public boolean verify(String hostname, SSLSession session) {
// return false;
// }
// });
// } catch (Exception e) {
// e.printStackTrace();
// }
}
/**
* call.execute();
* 同步GET请求 因为是耗时操作,要在子线程里执行 new Thread(new Runnable())
* @param url 请求链接
* @param netCallBack
* @throws IOException
*/
public void get(String url,GetCallBack netCallBack) throws IOException {
//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.get()//默认get,可省略
.url(url)
.build();
Call call = mOkHttpClient.newCall(request);
//请求加入调度
Response response = call.execute();
netCallBack.success(response);
// response.body().string();
}
/**
* 异步get
* @param url
* @param callBack
*/
@Override
public void get(String url, final INetCallBack callBack) {
Request.Builder builder=new Request.Builder();
final Request request = builder.get().url(url).build();
Call call = sOkhttpClient.newCall(request);
// 同步
// Response response = call.execute();
// 异步
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
sHandler.post(new Runnable() {
@Override
public void run() {
callBack.failed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
final String string = response.body().string();
sHandler.post(new Runnable() {
@Override
public void run() {
callBack.success(string);
}
});
}catch (Throwable e){
e.printStackTrace();
callBack.failed(e);
}
}
});
}
/**
* 同步POST请求
* @param url
* @param bodyParams
* @return
*/
public Response post(String url, Map<String,String> bodyParams) throws IOException {
RequestBody body = getBodyParams(bodyParams);
Request.Builder builder = new Request.Builder();
Request request = builder.post(body)
.url(url)
.build();
Call call = sOkhttpClient.newCall(request);
//请求加入调度
Response response = call.execute();
return response;
}
/**
* 异步post
* @param url
* @param bodyParams
* @param headersParams
* @param callBack
*/
@Override
public void post(String url, Map<String, String> bodyParams,Map<String,String> headersParams, INetCallBack callBack) {
Request.Builder builder=new Request.Builder();
final Request request = builder.post(getBodyParams(bodyParams))
.url(url)
.headers(getRequestHeaders(headersParams))
.build();
Call call = sOkhttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
/**
* 添加请求头
* @param hedersParams
* @return
*/
private Headers getRequestHeaders(Map<String,String> hedersParams){
Headers headers = null;
Headers.Builder builder = new Headers.Builder();
if (hedersParams != null){
Iterator<String> iterator = hedersParams.keySet().iterator();
while (iterator.hasNext()){
String key = iterator.next();
builder.add(key,hedersParams.get(key));
}
}
headers = builder.build();
return headers;
}
/**
* 设置请求参数
* @param bodyParams
* @return RequestBody
*/
private RequestBody getBodyParams(Map<String,String> bodyParams) {
RequestBody body = null;
FormBody.Builder formBody = new FormBody.Builder();
if (bodyParams != null) {
Iterator<String> iterator = bodyParams.keySet().iterator();
String key = "";
while (iterator.hasNext()) {
key = iterator.next().toString();
formBody.add(key, bodyParams.get(key));
}
}
return formBody.build();
}
}
5、新建一个对外的类供外部调用
public class AppUpdater {
private static AppUpdater instance = new AppUpdater();
//网络请求,下载
private INetManager netManager=new OkHttpINetManager();
// 如果更换网络框架可以调用此方法
public void setNetManager(INetManager manager){
netManager=manager;
}
public INetManager getNetManager(){
return netManager;
}
public static AppUpdater getInstance(){
return instance;
}
}
6、清单文件添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
Android 9.0网络请求还要添加:
6.1、在res目录里新建一个xml 包
在这个包中新建一个network_security_congig.xml文件(名字随便起)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
6.2、在清单文件的application节点下调用
android:networkSecurityConfig="@xml/network_security_config"
7、请求
地址:public String url="http://59.110.162.30/app_updater_version.json";
TextView updateApp = (TextView) findViewById(R.id.download);
updateApp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppUpdater.getInstance().getNetManager().get(url, new INetCallBack() {
@Override
public void success(String response) {
Log.d("===", "success: "+response);
// 解析json
// 把json的解析放到DownLoadBeen,没必要暴露出去,
DownLoadBeen been=DownLoadBeen.parse(response);
Toast.makeText(MainActivity.this,been.content,Toast.LENGTH_SHORT).show();
}
@Override
public void failed(Throwable throwable) {
Log.d("===", "failed: "+throwable);
Toast.makeText(MainActivity.this,"版本更新失败",Toast.LENGTH_SHORT).show();
}
});
}
});
8、解析json (json解析成对象)
新建一个json实体类
public class DownLoadBeen implements Serializable{
/**
* title : 4.5.0更新啦!
* content : 1. 优化了阅读体验;
2. 上线了 hyman 的课程;
3. 修复了一些已知问题。
* url : http://59.110.162.30/v450_imooc_updater.apk
* md5 : 14480fc08932105d55b9217c6d2fb90b
* versionCode : 450
*/
public String title;
public String content;
public String url;
public String md5;
public String versionCode;
/**
* 将json解析成对象
* @param response
* @return
*/
public static DownLoadBeen parse(String response) {
try {
JSONObject jsonObject=new JSONObject(response);
String title = jsonObject.optString("title");
String content = jsonObject.optString("content");
String url = jsonObject.optString("url");
String md5 = jsonObject.optString("md5");
String versionCode = jsonObject.optString("versionCode");
DownLoadBeen been=new DownLoadBeen();
been.title=title;
been.content=content;
been.url=url;
been.md5=md5;
been.versionCode=versionCode;
return been;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
持续更新中。。。