- 安卓网络编程之Retrofit框架
- 前言
- 一、Retrofit框架
- 二、使用步骤
- 1.引入库
- 2.简单使用直接贴个代码吧
- 2.1先定义一个接口
- 2.2简单使用贴一下使用的代码
- 3.进阶使用一:直接将数据转对象,无需用第三方库gson等
- 4.进阶使用二:使用带参数发起请求@Query
- 5.进阶使用三:@QuaryMap
- 总结
前言
在前面的文章里我记录了java的网络请求方式,后来记录了OKHttp框架,然后由于OkHttp框架大声还是诀的麻烦了,于是,又有了这个Retrofit框架,这个Retrofit是在OkHttp上进一步封装了,还引入了注解处理方式,最近正好在学习,那就记录一下吧,
一、Retrofit框架
可以去github上看哈,这里我贴一下地址
https://square.github.io/retrofit/
代码如下(示例):
这里的4个建议直接一次引入,具体为什么后面就知道了
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//gson转换器
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
//rxjava转换器
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
//string转换器
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
2.简单使用直接贴个代码吧
2.1先定义一个接口
代码如下(示例):
package com.example.retrofit;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
public interface MyRetrofit {
@GET("/") //注意这个是接口,不是
Call getJson();//这里的方法名随便写啦,但是前面的数据类型表示返回的原始数据类型
}
注意看我导入的包,不要弄错啦
2.2简单使用贴一下使用的代码public class MainActivity extends AppCompatActivity {
private String TAG;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//随便搞个tv
textView = findViewById(R.id.TE);
//这里感觉和okHttp类似有没有
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.wanandroid.com/banner/json/")//没有接口用的同学可以去搜玩安卓
.build();
//这里有区别是通过create方法将接口实例化
MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
//实例化了不就可以调用上面那个方法了对不对,然后我们就得到返回的原始数据了
Call json = myRetrofit.getJson();
//然后将其入队重写方法就有下面的了,没啥好说的,和OKhttp差不多
json.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
//请求成功了处理数据
if (response.isSuccessful()) //获取一下请求码,判断一下
{
String s = response.body().String;//===============注意这里是String不是toString,否则结果不对的
Gson gson = new Gson();
//使用第三方库让字符串转对象,但是有更简单的方法啦
myBean myBean = gson.fromJson(s, myBean.class)
Log.e(TAG, "onResponse: ->"+s );
textView.setText(s);//注意这两个都是在主线程,可以直接操作UI
}
}
@Override
public void onFailure(Call call, Throwable t) {
//这是失败的时候
Log.e(TAG, "onFailure: 失败了");
}
});
}
}
特别说明一下:
retrofit把网络请求的Url分成两部分设置:第一部分在创建Retrofit实例时通过.baseUrl()设置,第二部分在网络接口注解中设置,比如上面接口的"“/discovery/categories”,网络请求的完整地址Url = Retrofit实例.baseUrl()+网络请求接口注解(),注意这个/吧,好像有的时候会出问题的,就是两部分交替的那里
上面的4个依赖就共同写作起作用了,直接上代码
修改接口
public interface MyRetrofit {
@GET("/")
Call getJson();//============注意这里修改了返回的数据类型为jsResult
}
好了接着去修改活动的代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.TE);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.wanandroid.com/banner/json/")
.addConverterFactory(GsonConverterFactory.create())//===================注意这一行必须要添加
.build();
MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
Call json = myRetrofit.getJson();
json.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
//请求成功了处理数据
if (response.isSuccessful()) {//获取一下请求码,判断一下
JsResult body = response.body();//===================这一句就可以了简单不,他就直接变成和我们bean类中对应的对象了
}
}
@Override
public void onFailure(Call call, Throwable t) {
//这是失败的时候
Log.e(TAG, "onFailure: 失败了");
}
});
}
4.进阶使用二:使用带参数发起请求@Query
这个是要根据接口来配合使用的,我看玩安卓的数据太多了,这个借用一下领劵联盟的接口,不知道的b站搜索一下就好了
对应的baseUrl改成这个https://api.sunofbeaches.com/shop
好了,上代码,在代码中注释说明吧
先新建bean类,这个不贴代码了,修改我们的接口吧
public interface MyRetrofit {
@GET("/")
Call getJson();
@GET("/search")//注意这里不要写错,要与文档保持一致
Call getParam(@Query("keyword")String keyword,@Query("page")int page);//这里是主要部分
}
接着修改活动中代码,都差不多
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.TE);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.sunofbeaches.com/shop/")
.addConverterFactory(GsonConverterFactory.create())
.build();
MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
Call task = myRetrofit.getParam("搜索关键字", 0);
task.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
//请求成功了处理数据
if (response.isSuccessful()) {//获取一下请求码,判断一下
//这一句就可以了简单不
getWithParam body = response.body();
String s = body.toString();
textView.setText(s);
}
}
@Override
public void onFailure(Call call, Throwable t) {
//这是失败的时候
Log.e(TAG, "onFailure: 失败了");
}
});
}
}
有个不好的消息就是他这个服务器好像也不工作了哈哈哈,尴尬,还是去玩安卓上找一个吧
5.进阶使用三:@QuaryMap同样还是修改接口
public interface MyRetrofit {
@GET("/")
Call getJson();
@GET("/search")//注意这里不要写错,要与文档保持一致
Call getParam(@Query("keyword")String keyword,@Query("page")int page);
Call getParamsWithMap(@QueryMap Map params);;//注意返回的类型不是新的,是上面的,因为是上面的集合嘛
接着修改
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.TE);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.sunofbeaches.com/shop/")
.addConverterFactory(GsonConverterFactory.create())
.build();
MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
//===========修改处
Map param = new HashMap<>();
param.put("keyword","搜索关键字");
param.put("page",0);
//再把这个集合作为参数传进去
Call paramsWithMap = myRetrofit.getParamsWithMap(param);
paramsWithMap.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
//请求成功了处理数据
if (response.isSuccessful()) {//获取一下请求码,判断一下
//这一句就可以了简单不
getWithParam body = response.body();
String s = body.toString();
textView.setText(s);
}
}
@Override
public void onFailure(Call call, Throwable t) {
//这是失败的时候
Log.e(TAG, "onFailure: 失败了");
}
});
}
}
这都差不多啦
写着写着发现了一篇总结的好的文章https://www.jianshu.com/p/bca05b853c8c,
ok,不写了哈哈哈哈哈
更多内容-> https://www.jianshu.com/p/bca05b853c8c,



