持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情,希望大家多多支持,帮忙点个赞,谢谢!
前言
已经在工作接了不少次服务器请求接口,之前都是跟着模仿前人的代码,很少去总结,正好,现在把这一知识融汇贯通一下,也算一收获。 本篇文章围绕网络请求展开,来聊聊安卓中如何去实现这任务的,当然,我事先也在众多大神博客中了解到网络请求有很多方法,不止我这一种,如有错误,烦请指正。
正篇
通过对代码的阅读,工作中我用的应该是Retrofit2请求方法,如下: 首先先定义一个接口文件, get请求样式:
public interface Api {
//get请求
@GET("user") //请求方法注解,get请求,括号内的是请求地址,Url的一部分
Call<ResponseBody> getData();//Call<*>返回类型,*表示接收数据的类,一般自定义 接口方法名称,括号内可以写入参数
}
post请求实例:
@POST("XXXX")
@Headers({"Content-Type: application/x-www-form-urlencoded;charset=utf-8","CONNECT_TIMEOUT:20000", "READ_TIMEOUT:20000", "WRITE_TIMEOUT:20000"}) //定义头部
Call<ResponseBody> getXXXXXXX(
@Body RequestBody requestBody
);
我写的是用单例实现的:
//单例
private Retrofit2Manager() {
retrofitMap = new ConcurrentHashMap<>();
client = new OkHttpClient.Builder().
connectTimeout(30, TimeUnit.SECONDS).
readTimeout(30, TimeUnit.SECONDS).
writeTimeout(30, TimeUnit.SECONDS).
connectionPool(new ConnectionPool(5,30,TimeUnit.SECONDS)).build();
}
public <T> T getApi(Class<T> clz, String url) {
if (retrofitMap.get(url) == null) {
synchronized (retrofitMap) {
if (retrofitMap.get(url) == null) {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(url)
.client(client)
.build();
retrofitMap.put(url, retrofit);
}
}
把我们需要的请求的url以及对应的结构体类传进去,然后再用:
Call<ResponseBody> call
去创建Call对象用于callback监听回调获取返回体从而拿到我们想要的返回值。
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if(response.code()== HttpURLConnection.HTTP_OK){
if (response.body() == null) {
return;
}
String jsonStr= null;
try {
jsonStr = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
...
}
@Override
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {...}
});
这样看起来应用还是蛮简单的,下一节我们将具体探讨retrofit的使用,本节为应用示例。
小结
在写文章的时候顿了很多次,因为我对这块研究还不是很深,代码不是特别熟练,所以后续还会深入探讨,展开去说说,顺便拓展其他请求方法。