一个App带你学会Retrofit2.0,麻麻再也不用担心我的网络请求了!

举报
江南一点雨 发表于 2021/08/17 00:39:02 2021/08/17
【摘要】 Retrofit、Retrofit、Retrofit,越来越多的人在玩这个网络请求框架,这个由squareup公司开源的网络请求框架确实挺好用,今天我们就来看一下这个东东怎么玩! Retrofit作为一个简化的HTTP请求库其实已经有很长一段时间了,只不过在早期的版本里有些地方用的不是特别爽,Retrofit从2.0开始修改了许多之前的痛点,现在不仅更好用而且功能也更加的强大...

Retrofit、Retrofit、Retrofit,越来越多的人在玩这个网络请求框架,这个由squareup公司开源的网络请求框架确实挺好用,今天我们就来看一下这个东东怎么玩!

Retrofit作为一个简化的HTTP请求库其实已经有很长一段时间了,只不过在早期的版本里有些地方用的不是特别爽,Retrofit从2.0开始修改了许多之前的痛点,现在不仅更好用而且功能也更加的强大。我们可以在Retrofit中利用接口、方法和注解参数等来声明定义一个请求该如何被创建。同时它还有一个非常鲜明的特点就是支持REST风格的请求,同时它还很好的解决了线程异步访问问题,支持RxJava等。好了,废话不多说,我们先来看看今天要实现的效果图。



我们就来做这样一个简单的列表,看看如何使用Retrofit来实现。OK,这里主要通过如下四步来使用Retrofit。

1.导包

2.定义API接口

3.初始化Retrofit

4.发起网络请求

1.导包

要使用Retrofit,首先肯定是导包,我这里导入两个包,如下:


  
  1. compile 'com.squareup.retrofit2:retrofit:2.1.0'
  2. compile 'com.squareup.retrofit2:converter-gson:2.1.0'


2.定义API接口

接下来我们来定义相关的网络请求接口,在Retrofit2.0中,APIService的定义也将是一个非常简单的事情,比如我们这个案例,我定义的APIService如下:


  
  1. public interface ApiService {
  2. //获取TabLayout上的数据
  3. @GET("api/lore/classify")
  4. Call<ClassfyBean> getClassfyData();
  5. //获取首页列表的数据
  6. @GET("api/lore/list")
  7. Call<CateItemBean> getListData(@Query("id") int id);
  8. //获取详情数据
  9. @GET("api/lore/show")
  10. Call<DetailBean> getDetailData(@Query("id") int id);
  11. }


  
  1. @FormUrlEncoded
  2. @POST("api/lore/list")
  3. Call<CateItemBean> getListData(@Field("id") int id);

Call请求接收一个泛型参数,该参数表示该请求的返回对象,Retrofit在收到返回值之后会根据我们传递的对象转换工厂方法将返回值转为该对象。

3.初始化Retrofit

定义好了APIService之后,接下来我们就可以初始化Retrofit了,Retrofit的初始化很简单,如下:


  
  1. Retrofit retrofit = new Retrofit.Builder()
  2. .baseUrl("http://www.tngou.net/")
  3. .addConverterFactory(GsonConverterFactory.create())
  4. .build();


  
  1. Gson: com.squareup.retrofit:converter-gson
  2. Jackson: com.squareup.retrofit:converter-jackson
  3. Moshi: com.squareup.retrofit:converter-moshi
  4. Protobuf: com.squareup.retrofit:converter-protobuf
  5. Wire: com.squareup.retrofit:converter-wire
  6. Simple XML: com.squareup.retrofit:converter-simplexml

OK,这是一个最最基本的配置,Retrofit的网络请求使用了OKHttp,但是我们这里怎么没有配置呢?如果你不配置,系统会默认创建一个OKHttp对象,如果你配置了那也没问题,配置方式如下:


  
  1. OkHttpClient client = new OkHttpClient.Builder()
  2. .connectTimeout(5, TimeUnit.SECONDS)
  3. .readTimeout(10,TimeUnit.SECONDS)
  4. .build();
  5. Retrofit retrofit = new Retrofit.Builder()
  6. .baseUrl("http://www.tngou.net/")
  7. .addConverterFactory(GsonConverterFactory.create())
  8. .client(client)
  9. .build();

4.发起网络请求

做完上面几步之后,接下来我们就可以发起一个网络请求了,代码如下:


  
  1. ApiService apiService = retrofit.create(ApiService.class);
  2. Call<ClassfyBean> call = apiService.getClassfyData();
  3. call.enqueue(new Callback<ClassfyBean>() {
  4. @Override
  5. public void onResponse(Call<ClassfyBean> call, Response<ClassfyBean> response) {
  6. ClassfyBean body = response.body();
  7. List<Fragment> fragments = new ArrayList<Fragment>();
  8. for (int i = 0; i < body.getTngou().size(); i++) {
  9. fragments.add(BaseFragment.getInstance(body.getTngou().get(i).getId()));
  10. }
  11. VpAdapter adapter = new VpAdapter(getSupportFragmentManager(), fragments, body);
  12. viewPager.setAdapter(adapter);
  13. tabLayout.setupWithViewPager(viewPager);
  14. }
  15. @Override
  16. public void onFailure(Call<ClassfyBean> call, Throwable t) {
  17. Log.d("google_lenve", "onFailure: "+t.getMessage());
  18. }
  19. });

Response<ClassfyBean> execute = call.execute();
 



5.其他

以上几个知识点已经可以实现我们的需求了,但是既然说到了Retrofit,那我们就再来聊聊它的其他一些功能点。

在Retrofit中还有一个注解叫做@Path,这个表示URL地址的一个占位符,使用方式如下:


  
  1. @GET("api/{id}/delete")
  2. Call<DetailBean> getData(@Path("id")String id);


OK,这篇介绍就到这里,后面我们再来说说Retrofit配合RxJava使用的问题。


以上。。。


文章一开始的项目地址:https://github.com/lenve/Retrofit



文章来源: wangsong.blog.csdn.net,作者:_江南一点雨,版权归原作者所有,如需转载,请联系作者。

原文链接:wangsong.blog.csdn.net/article/details/52143090

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。