总结一下Android比较常用的开源库的使用方式,包括okhttp、glide、GSON、leakcanary、litepal等
目录
一、OkHttp
二、GSON
三、Glide
一、OkHttp
1、添加OkHttp库的依赖
在app/build.gradle文件中,dependencies闭包中加入依赖:
dependencies {
......
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
}
2、使用方法
(1)Get请求
/*发送HTTP Get请求
* 参数:
* address:请求的url地址
* */
public static void sendOkHttpRequest(final String address){
new Thread(new Runnable() {
@Override
public void run() {
//创建一个OkHttpClient的实例
OkHttpClient okHttpClient = new OkHttpClient();
//创建一个Request对象
Request request = new Request.Builder().url(address).build();
try {
//调用OkHttpClient的newCall()方法来创建一个Call对象,通过它的execute()方法来发送请求并获取服务器返回的数据
Response response = okHttpClient.newCall(request).execute();
Log.d(TAG, "run: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
需要注意的是,发送网络请求属于耗时操作,无法在UI线程(主线程)进行,使用的时候一定单独起一个子线程去发送网络请求,否则会抛出android.os.NetworkOnMainThreadException的异常导致程序崩溃。
因此,OkHttp提供了一个回调接口,可供调用方有时机去处理服务器返回的数据
/*发送HTTP Get请求
* 参数:
* address: 请求的url地址
* callback: OkHttp回调接口
* */
public static void sendOkHttpRequest2(String address, Callback callback){
//创建一个OkHttpClient的实例
OkHttpClient okHttpClient = new OkHttpClient();
//创建一个Request对象
Request request = new Request.Builder().url(address).build();
//调用OkHttpClient的newCall()方法来创建一个Call对象
//enqueue()方法内部会开启一个子线程去执行http请求,并将最终的请求结果回调到Callback中
okHttpClient.newCall(request).enqueue(callback);
}
调用方式:
HttpUtilty.sendOkHttpRequest("http://www.baidu.com", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "http connected failed", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_SHORT).show();
}
});
}
});
需要注意的是,Callback最终的回调接口还是在okhttp起的子线程中运行的,因此不可以直接在回调接口里执行任何UI操作,可以借助runOnUiThread()方法来进行线程切换。
(2)Post请求
public static void sendOkHttpPostRequest(String address, Callback callback){
//创建一个OkHttpClient的实例
OkHttpClient okHttpClient = new OkHttpClient ();
//构建一个RequestBody对象来存放待提交的参数
RequestBody requestBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
//创建一个Request对象
Request request = new Request.Builder()
.url(address)
.post(requestBody)
.build();
//调用OkHttpClient的newCall()方法来创建一个Call对象
//enqueue()方法内部会开启一个子线程去执行http请求,并将最终的请求结果回调到Callback中
okHttpClient.newCall(request).enqueue(callback);
}
二、GSON
1、添加GSON依赖: 其他引入方式可参照github gson开源库:https://github.com/google/gson
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}
2、使用方式
比如说要解析的JSON数据格式如下:
{
"n": "Tom",
"a": 20,
"p": {
"f": "Peter",
"m": "Mary"
}
}
,其中n标识name,a标识age,p标识parent,f标识father,m标识mother
(1)定义一个Person类,包含name、age、parent等属性
public class Person {
//由于JSON中的一些字段不一定适合直接作为Java字段命名,可以使用GSON提供的注解来让JSON字段和
//JAVA字段之间建立映射
@SerializedName("n")
public String name;
@SerializedName("a")
public String age;
@SerializedName("p")
public Parent parent;
public class Parent{
@SerializedName("f")
public String father;
@SerializedName("m")
public String mother;
}
}
(2)使用Gson解析json数据
public static Person handleJsonData(String jsonData){
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);
return person;
}
如果解析的是一段JSON数组(如下所示),里边每个元素的数据格式都是一致的,则要借助TypeToken将期望解析成的数据类型传入到fromJson()方法中
[{
"n": "Tom",
"a": 20,
"p": {
"f": "Peter",
"m": "Mary"
}
},
{
"n": "Penny",
"a": 18,
"p": {
"f": "Peter",
"m": "Mary"
}
}
]
public static void handleJsonListData(String jsonData){
Gson gson = new Gson();
List<Person> personList = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
for (Person person:personList){
Log.d(TAG, "name: " + person.name);
}
}
三、Glide
1、引入依赖: https://github.com/bumptech/glide
2、使用方式:
在Layout中创建一个ImageView,在Activity中利用Glide的方法给ImageView设置view:
Glide.with(this).load(picUrl).into(bingPicImage);
四、LitePal
五、LeakCanary