年少不知封装好
- 记一下关于Android里面okhttp网络请求的使用笔记,因为最近做Android的项目,okhttp没做封装而是大段copy,导致整个项目代码繁杂凌乱,需求决定了需要频繁的向服务器发起网络请求,自己写代码又没有写注释的习惯,后面自己回过头看代码的时候是真的头大,人都差点给我整没了,所以作为Java三大特性的封装,现在来看还是很有必要的,再不济也得抽离个方法出来后面直接回调,便于代码理解以及项目修改等等,年少不知封装好,错把copy当成宝。
okhttp库文件添加依赖
- 先介绍一下这玩意吧!书上说的是在开源盛行的今天,有许多很出色的网络通信库可以替代Android原生的httpurlconnection网络请求,其中okhttp就是一个很不错的通信库,错不错我不知道,但是okhttp用起来是真的爽,如果有用okhttp来发网络请求的经历,再回去看Android原生的那一个,是真的没可比性,okhttp在封装接口上做的简单易懂,据说在底层的实现上也是自成一派,目前来说是Android开发首选的网络通信库,所以还是很推荐大家去使用的,至于原生的那款通信库了解了解就行了吧,那边主要是可以更加清晰的感知到整个网络请求的发起过程,但代码相对于okhttp来说繁琐不推荐使用!
- okhttp的项目主页地址,在使用okhttp的时候肯定先要在Android studio里面添加依赖。
1.第一种呢就是直接导jar包,把Android studio的项目结构先换成project,打开lib目录后直接copy okhttp的jar包进去,然后点击Android studio右上角的小象直接把jar包添加到构建路径(那个小象叫gradle),可以理解和Java里面的maven,反正大致功能一样都是用来做项目管理的。
2.第二种就是说在没有jar包的情况下,直接在项目中添加okhttp库的依赖,说简单点就是给项目指定个网络路径,让项目自己去下载okhttp的库文件,编辑app/build.gradle文件,在dependencise闭包内添加以下内容:
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.github.bumptech.glide:glide:4.11.0'
// 这一行为添加的内容 即添加okhttp库的依赖
compile 'com.squareup.okhttp3:okhttp:3.4.1'
}
添加完路径之后给他Sync Now一下,这里项目应该是会自己下载两个jar包,一个okhttp库一个okio库,后面那个是前面那个通信的基础(IO流?瞅着很像的嘞),最后让子弹飞一会就好了!
okhttp网络请求的使用
//开启一个线程来发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
//先来创建一个okhttp的实例
OkHttpClient okHttpClient=new OkHttpClient();
//要发起请求的话 肯定要有一个Request对象
Request request=new Request.Builder()
//.url()方法设置要访问的目标地址
.url("")
//.build()之前可以连缀很多方法来丰富这个Request对象
.build();
//调用OkHttpClient的newCall()方法来创建一个Call对象并调用execute()方法发送请求获取服务器数据
try {
Response response=okHttpClient.newCall(request).execute();
//声明一个变量来接受服务器返回的数据
String res=response.body().string();
//打印日志 相当于Java里面的System.out.print(); 但Android的打印推荐使用log
Log.d("返回数据",res);
//这里给他抛出一下异常
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
//开启一个线程来发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
//先来创建一个okhttp的实例
OkHttpClient okHttpClient=new OkHttpClient();
//要发起post请求的话 需要先构建出一个requestBody对象来存放待提交的数据
RequestBody requestBody=new FormBody.Builder()
.add("key","key")
.build();
//要发起请求的话 肯定要有一个Request对象
Request request=new Request.Builder()
//.url()方法设置要访问的目标地址
.url("")
//调用post方法
.post(requestBody)
//.build()之前可以连缀很多方法来丰富这个Request对象
.build();
//调用OkHttpClient的newCall()方法来创建一个Call对象并调用execute()方法发送请求获取服务器数据
try {
Response response=okHttpClient.newCall(request).execute();
//声明一个变量来接受服务器返回的数据
String res=response.body().string();
//打印日志 相当于Java里面的System.out.print(); 但Android的打印推荐使用log
Log.d("返回数据",res);
//这里给他抛出一下异常
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
//开启一个线程来发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
//先来创建一个okhttp的实例
OkHttpClient okHttpClient=new OkHttpClient();
//创建一个json对象来提交数据
JSONObject jsonObject=new JSONObject();
boolean key = false;
jsonObject.put("key",key);
String json=jsonObject.toString();
//要发起post请求的话 需要先构建出一个requestBody对象来存放待提交的数据
RequestBody requestBody=RequestBody
.create(MediaType.parse("application/json;charset=utf-8"), json);
//要发起请求的话 肯定要有一个Request对象
Request request=new Request.Builder()
//.url()方法设置要访问的目标地址
.url("")
//调用post方法
.post(requestBody)
//.build()之前可以连缀很多方法来丰富这个Request对象
.build();
//调用OkHttpClient的newCall()方法来创建一个Call对象并调用execute()方法发送请求获取服务器数据
Response response=okHttpClient.newCall(request).execute();
//声明一个变量来接受服务器返回的数据
String res=response.body().string();
//打印日志 相当于Java里面的System.out.print(); 但Android的打印推荐使用log
Log.d("返回数据",res);
//这里给他抛出一下异常
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
可以看到post请求相对于get请求来说就只是多出一个requestBody对象来存放需要提交的参数,不同格式数据提交的post请求也是大同小异,还是比较容易理解的。
okhttp网络请求的简单封装
- 在实际的编写代码中,不可能做到发一次网络请求就写一次代码,这种做法其实也不是不行,只是太麻烦了,大段大段的重复代码是很差劲的,我们可以将通用的网络请求提取出来给他装到一个公共的类里面去,给他提供一个静态方法,用的时候只需要调用这个方法就好了。
- get请求静态方法
public class NewOk {
public static void get(String url,okhttp3.Callback callback){
//okhttp3.Callback是okhttp自带的一个回调接口
OkHttpClient okHttpClient=new OkHttpClient();
Request request=new Request.Builder().url(url).build();
//.enqueue方法的内部会自己打开子线程 会在子线程中执行请求 最后将返回值回调callback
okHttpClient.newCall(request).enqueue(callback);
}
}
NewOk.get("http:/www.baidu.com", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//打印异常日志 这不搞一个log 错哪你都不知道
Log.d("e", String.valueOf(e));
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//服务器返回的具体内容
String res=response.body().string();
Log.d("res",res);
}
});
特别注意的是:要记得声明网络权限! 在manifists文件内添加:
<uses-permission android:name="android.permission.INTERNET" />
|