目录

1.Retrofit是什么?

2.OkHttp和Retrofit

3.Retrofit的使用(异步GET)

1 添加Retrofit库的依赖

2 添加网络权限

3 创建接收服务器返回数据的类

4 创建用于描述网络请求的接口

5 创建Retrofit实例

6 创建网络请求接口实例

7 发送网络请求

8 处理返回结果

4 Retrofit的使用(异步POST)

1 添加Retrofit库的依赖

2 添加网络权限

3 创建接收服务器返回数据的类

4 创建用于描述网络请求的接口 (接收请求体)

5 创建Retrofit实例

6 创建网络请求接口实例

7 发送网络请求

8 处理返回结果

5Retrofit+OkHTTP+RecycleView的实现步骤

第一步: 创建项目

第二步:导入依赖

第三步:添加网络权限

第四步:在activity_main.xml添加Recycle,并给其设置id

第五步:创建子布局 news_item.xml

第六步:创建实体类

第七步:创建适配器

第八步:设置适配器

第九步:进行网络请求


1.Retrofit是什么?

准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装

原因:
网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责网络请求接口的封装。App应用程序通过 Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户 的需求对结果进行解析。所以,网络请求的本质仍旧是OkHttp完成的,retrofit只是帮使用者来进行工 作简化的,比如配置网络,处理数据等工作,提高这一系列操作的复用性。这也就是网上流行的一个不 太准确的总结:
OkHttp是瑞士军刀,retrofit则是将瑞士军刀包装成了一个非常好用的指甲钳

2.OkHttp和Retrofit

OKhttp的意义:
OkHttp是基于Http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient,HttpUrlConnection的职责是一样的。
OkHttp的职责:
OkHttp主要负责socket部分的优化,比如多路复用,buffer缓存,数据压缩等等。
OkHttp给用户留下的问题
1. 用户网络请求的接口配置繁琐,尤其是需要配置请求body,请求头,参数的时候;
2. 数据解析过程需要用户手动拿到responsbody进行解析,不能复用;
3. 无法适配自动进行线程的切换。
使用Retrofit解决问题
Retrofit主要负责应用层面的封装,就是说主要面向开发者,方便使用,比如请求参数,响应数据的处 理,错误处理等等。
Retrofit封装了具体的请求,线程切换以及数据转换。
网上一般都推荐RxJava+Retrofit+OkHttp框架,Retrofit负责请求的数据和请求的结果,使用接口的 方式呈现,OkHttp负责请求的过程,RxJava负责异步,各种线程之间的切换,用起来非常便利。
主要的步骤都是:
创建网络请求实体client->构建真正的网络请求-> 将网络请求方案与真正的网络请求实体结合构成一个 请求Call->执行网络请求->处理返回数据->处理Android 平台的线程问题。

在上图中,我们看到的对比最大的区别是什么?
1. OkHttp创建的是OkhttpClient,然而retrofit创建的是Retrofit实例
2. 构建蓝色的Requet的方案,retrofit是通过注解来进行的适配
3. 配置Call的过程中,retrofit是利用Adapter适配的OkhttpCall
4. 相对okhttp,retrofit会对responseBody进行自动Gson解析
5. 相对okhttp,retrofit会自动的完成线程的切换

3.Retrofit的使用(异步GET

        1 添加Retrofit库的依赖

由于Retrofit是基于OkHttp,所以还需要添加OkHttp库依赖
implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

2 添加网络权限

AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>

        3 创建接收服务器返回数据的类

PhoneAddress.java
       
public class PhoneAddress {private boolean success;private String tel;private Info info;public static class Info{private String local;private String duan;private String type;private String yys;private String bz;@Overridepublic String toString() {return "Info{" +"local='" + local + '\'' +", duan='" + duan + '\'' +", type='" + type + '\'' +", yys='" + yys + '\'' +", bz='" + bz + '\'' +'}';}}public void show(){System.out.println(success);System.out.println(tel);System.out.println(info.local);System.out.println(info.duan);System.out.println(info.type);System.out.println(info.yys);System.out.println(info.bz);}@Overridepublic String toString() {return "PhoneAddress{" +"success=" + success +", tel='" + tel + '\'' +", info=" + info +'}';}
}

        4 创建用于描述网络请求的接口

GetRequest_Interface.java
public interface GetRequest_Interface {@GET("api/phone?")Call<PhoneAddress> getCall(@Query("tel")String tel);
}

5 创建Retrofit实例

        6 创建网络请求接口实例

        7 发送网络请求

        8 处理返回结果

//创建Retrofit对象
Retrofit retrofit=new Retrofit.Builder().baseUrl("https://api.vvhan.com/").addConverterFactory(GsonConverterFactory.create()).build();
//创建网络请求接口的实例
GetRequest_Interface request=retrofit.create(GetRequest_Interface.class);
//对发送送请求进行封装
Call<PhoneAddress> call=request.getCall(phonenum);
//发送网络请求(异步)
call.enqueue(new Callback<PhoneAddress>() {@Overridepublic void onResponse(Call<PhoneAddress> call, Response<PhoneAddress> response) {tv_show.setText(response.body().toString());}@Overridepublic void onFailure(Call<PhoneAddress> call, Throwable t) {Log.i("onFailure","请求失败");}
});

4 Retrofit的使用(异步POST

       1 添加Retrofit库的依赖  

implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

2 添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

        3 创建接收服务器返回数据的类

public class LoginInfo {private int success;private String info;@Overridepublic String toString() {return "LoginInfo{" +"success=" + success +", info='" + info + '\'' +'}';}
}

4 创建用于描述网络请求的接口 (接收请求体)

public interface PostRequest_Interface {@POST("login")Call<LoginInfo> postCall(@Body RequestBody requestBody);
}

5 创建Retrofit实例

        6 创建网络请求接口实例

        7 发送网络请求

        8 处理返回结果

 private void postData(String num) {Retrofit retrofit=new Retrofit.Builder().baseUrl("http://192.168.17.181:8080/TestWeb_war_exploded/").addConverterFactory(GsonConverterFactory.create()).build();PostRequest_Interface request=retrofit.create(PostRequest_Interface.class);MediaType type=MediaType.Companion.parse("application/json;charset=utf-8");RequestBody body=RequestBody.Companion.create(num,type);Call<LoginInfo> call=request.postCall(body);call.enqueue(new Callback<LoginInfo>() {@Overridepublic void onResponse(Call<LoginInfo> call, Response<LoginInfo> response) {Log.i("onResponse",response.body().toString());}@Overridepublic void onFailure(Call<LoginInfo> call, Throwable t) {Log.i("onFailure","失败");}});}

5Retrofit+OkHTTP+RecycleView的实现步骤

第一步: 创建项目

第二步:导入依赖

implementation "com.github.bumptech.glide:glide:4.12.0" implementation("com.squareup.okhttp3:okhttp:4.10.0") implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

第三步:添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

第四步:在activity_main.xml添加Recycle,并给其设置id

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"android:padding="5dp"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_news"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

第五步:创建子布局 news_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="200dp"android:orientation="vertical"xmlns:app="http://schemas.android.com/apk/res-auto"app:cardCornerRadius="5dp"android:padding="5dp"app:cardElevation="5dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="190dp"android:layout_margin="5dp"android:orientation="horizontal"><ImageViewandroid:id="@+id/news_show"android:layout_width="190dp"android:layout_height="190dp"app:srcCompat="@drawable/ic_launcher_background" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_marginTop="5dp"android:id="@+id/news_title"android:layout_marginStart="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView" /><TextViewandroid:layout_marginTop="20dp"android:id="@+id/news_desc"android:layout_marginStart="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView" /></LinearLayout></LinearLayout>
</androidx.cardview.widget.CardView>

第六步:创建实体类

package com.hopu.day23_practice.model;import java.util.List;public class News {private boolean success;private String title;private String subtitle;private String update_time;private List<Data> data;public void setSuccess(boolean success) {this.success = success;}public boolean getSuccess() {return success;}public void setTitle(String title) {this.title = title;}public String getTitle() {return title;}public void setSubtitle(String subtitle) {this.subtitle = subtitle;}public String getSubtitle() {return subtitle;}public String getUpdate_time() {return update_time;}public void setUpdate_time(String update_time) {this.update_time = update_time;}public void setData(List<Data> data) {this.data = data;}public List<Data> getData() {return data;}public class Data {private int index;private String title;private String desc;private String pic;private String hot;private String url;private String mobilUrl;public void setIndex(int index) {this.index = index;}public int getIndex() {return index;}public void setTitle(String title) {this.title = title;}public String getTitle() {return title;}public void setDesc(String desc) {this.desc = desc;}public String getDesc() {return desc;}public void setPic(String pic) {this.pic = pic;}public String getPic() {return pic;}public void setHot(String hot) {this.hot = hot;}public String getHot() {return hot;}public void setUrl(String url) {this.url = url;}public String getUrl() {return url;}public void setMobilUrl(String mobilUrl) {this.mobilUrl = mobilUrl;}public String getMobilUrl() {return mobilUrl;}@Overridepublic String toString() {return "Data{" +"index=" + index +", title='" + title + '\'' +", desc='" + desc + '\'' +", pic='" + pic + '\'' +", hot='" + hot + '\'' +", url='" + url + '\'' +", mobilUrl='" + mobilUrl + '\'' +'}';}}@Overridepublic String toString() {return "News{" +"success=" + success +", title='" + title + '\'' +", subtitle='" + subtitle + '\'' +", update_time='" + update_time + '\'' +", data=" + data +'}';}
}

第七步:创建适配器

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {List<News.Data> list;public void setResource(List<News.Data> list){this.list=list;notifyDataSetChanged();}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false);ViewHolder viewHolder=new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {News.Data data=list.get(position);Glide.with(holder.view).load(data.getPic()).into(holder.news_show);holder.news_title.setText(data.getTitle());holder.news_desc.setText(data.getDesc());}@Overridepublic int getItemCount() {if (list==null){return 0;}else {return list.size();}}public class ViewHolder extends RecyclerView.ViewHolder {ImageView news_show;TextView news_title;TextView news_desc;View view;public ViewHolder(@NonNull View itemView) {super(itemView);view=itemView;news_desc=itemView.findViewById(R.id.news_desc);news_title=itemView.findViewById(R.id.news_title);news_show=itemView.findViewById(R.id.news_show);}}
}

第八步:设置适配器

    //声明容器NewsAdapter newsAdapter;RecyclerView rv_news;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rv_news=findViewById(R.id.rv_news);newsAdapter=new NewsAdapter();LinearLayoutManager layoutManager=new LinearLayoutManager(this);rv_news.setLayoutManager(layoutManager);rv_news.setAdapter(newsAdapter);initData();}

第九步:进行网络请求

1. 创建请求接口

public interface News_Interface {@GET("api/hotlist?type=zhihuHot")Call<News> getNews();
}
                2. 开始网络请求
                3. 处理返回结果
private void initData() {Retrofit retrofit=new Retrofit.Builder().baseUrl("https://api.vvhan.com/").addConverterFactory(GsonConverterFactory.create()).build();News_Interface news_interface=retrofit.create(News_Interface.class);Call<News> call=news_interface.getNews();call.enqueue(new Callback<News>() {@Overridepublic void onResponse(Call<News> call, Response<News> response) {Log.i("onResponse",response.body().toString());newsAdapter.setResource(response.body().getData());}@Overridepublic void onFailure(Call<News> call, Throwable t) {Log.i("onFailure","请求失败");}});}

Android Retrofit相关推荐

  1. Android Retrofit+RxJava 优雅的处理服务器返回异常、错误

    Android Retrofit+RxJava 优雅的处理服务器返回异常.错误 参考文章: (1)Android Retrofit+RxJava 优雅的处理服务器返回异常.错误 (2)https:// ...

  2. Android Retrofit @Streaming 注解失效

    Android Retrofit @Streaming 注解失效 问题特征: 即使加了@Streaming方法也不能达到逐步加载大文件数据的效果,产生的效果为下载会有长时间的卡顿,卡顿后,会在极端的时 ...

  3. Android Retrofit 2.0文件上传

    Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...

  4. Android Retrofit下载文件进度

    In this tutorial, we'll create an android application which downloads a file from the URL using Retr ...

  5. Android Retrofit 2.0(三)从源码分析原理

    Retrofit·特点 性能最好,处理最快 使用REST API时非常方便: 传输层默认就使用OkHttp: 支持NIO: 拥有出色的API文档和社区支持 速度上比volley更快: 如果你的应用程序 ...

  6. android retrofit 从无知到入门

    android retrofit 从无知到入门 前言 一.初识retrofit 1.retrofit是什么? 2.一些配置和数据准备 3.快速上手retrofit a.接口 b.实现 c.execut ...

  7. android retrofit 2.0公共参数,Android Retrofit 2.0 使用-补充篇

    之前分享的Android Retrofit 2.0 使用,属于基本的使用,实际开发还远远不够,因此对其补充,主要在Retrofit配置和接口参数. Retrofit配置 添加依赖 app/build. ...

  8. Android Retrofit实现原理分析

    retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...

  9. android get请求最长字符串,android – Retrofit @GET – 如何显示请求字符串?

    我正在使用一个使用Retrofit创建一个休息的客户端的 Android应用程序.为了调试网络调用,我想显示或转储实际被调用的url.有没有办法做到这一点?我已经在下面列出了一些代码,显示了应用程序当 ...

  10. Android --- Retrofit 上传/下载文件扩展实现进度的监听

    本文使用okhttp作为client来做,其实说白了跟用okhttp做下载上传进度监听几乎一样,参考了这篇文章:Android OkHttp文件上传与下载的进度监听扩展 1. 首先我们写两个接口用来下 ...

最新文章

  1. Yum编译安装Error Downloading Packages报错
  2. 用什么方法才能测量出无线发射模块的功率呢?
  3. 17_传智播客iOS视频教程_代码中的面向过程与面向对象以及优缺点分析
  4. RabbitMQ/pika模块
  5. leetcode276. 栅栏涂色
  6. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入
  7. Magento站点优化方案
  8. Ghost 命令参数详解
  9. python函数笔记_初学Python函数的笔记整理
  10. Hbase面试 描述 Hbase 中 scan 和 get 的功能以及实现的异同.
  11. weblogic + apache 负载均衡与Session复制
  12. 从零开始研发GPS接收机连载——4、GPS模拟器数据采集验证
  13. Gameplay - 多人游戏关卡设计
  14. TTL(UART)信号和RS232信号 对比
  15. Matplotlib进阶教程:布局讲解
  16. 云边协同关3篇政策与技术跟踪专题文章摘录
  17. 计算机无法连接到指定的服务器,无法连接Windows远程服务器的几种解决办法
  18. 20220223换硬盘操作
  19. C语言解决经典问题约瑟夫环--数组
  20. Springboot项目 web 添加 favicon.ico图标

热门文章

  1. php FPDF类库应用实现代码
  2. linux:/ete目录下的重要文件
  3. 【EfficientNet】EfficientNet网络结构及代码详解
  4. WPF定制实现自己的分页控件并配合DataGrid使用
  5. 通过这些快捷键解决YouTube的“空格键问题”
  6. 平面图最小割 BZOJ 2006
  7. ImportError: cannot import name ‘bbox_ious‘
  8. Python游戏嗷大喵快跑设计
  9. 简单Beautiful Soup教程
  10. 做市商交易策略-期货