• Retrofit


    1.Retrofit简介

    我们项目当中的每个app都需要用到网络和服务器进行交互,在Android项目开发中使用HTTP协议完成 通信的话,基本上都要用到OkHttp或者Retrofit。 OkHttp和Retrofit是目前应用最为广泛的网络组件。

    Retrofit是什么?

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

    原因:

    网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责网络请求接口的封装。 App应用程序通过

    Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数、 Header、 Url 等信息,之后由 OkHttp

    完成后续的请求操作。在服务端返回数据之后, OkHttp 将原始的结果交给 Retrofit, Retrofit根据用户 的需求对结果进行解析。所以,网络请求的本质仍旧是OkHttp完成的, retrofit只是帮使用者来进行工 作简化的,比如配置网络,处理数据等工作,提高这一系列操作的复用性。这也就是网上流行的一个不 太准确的总结:

    OkHttp是瑞士军刀, retrofit则是将瑞士军刀包装成了一个非常好用的指甲钳。

    3 Retrofit对OKhttp做了什么?

    Retrofit并没有改变网络请求的本质,也无需改变,因为OkHttp已经足够强大, Retrofit的封装可以说是 很强大,里面涉及到一堆的设计模式,可以通过注解直接配置请求,可以使用不同的http客户端,虽然 默认是用http,可以使用不同Json Converter 来序列化数据,同时提供对RxJava的支持,使用Retrofit + OkHttp + RxJava可以说是目前比较潮的一套框架,但是需要有比较高的门槛。

    OKHttp 和 Retrofit 有啥差别

    OKhttp的意义: OkHttp是基于Http协议封装的一套请求客户端,虽然它也可以开线程,但根本上 它更偏向真正的请求,跟HttpClient,HttpUrlConnection的职责是一样的。

    OkHttp的职责: OkHttp主要负责socket部分的优化,比如多路复用, buffer缓存,数据压缩等 等。

    Retrofit主要负责应用层面的封装,就是说主要面向开发者,方便使用,比如请求参数,响应数据的处 理,错误处理等等。

    Retrofit封装了具体的请求,线程切换以及数据转换。 网上一般都推荐RxJava+Retrofit+OkHttp框架, Retrofit负责请求的数据和请求的结果,使用接口的 方式呈现, OkHttp负责请求的过程, RxJava负责异步,各种线程之间的切换,用起来非常便利。

    Retrofit的使用

    1.添加Retrofit库的依赖

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

    2 添加网络权限

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

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

    1. public class PhoneAddress {
    2. private boolean success;
    3. private String tel;
    4. private Info info;
    5. public static class Info {
    6. private String local;
    7. private String duan;
    8. private String type;
    9. private String yys;
    10. private String bz;
    11. @Override
    12. public String toString() {
    13. return "Info{" +
    14. "local='" + local + '\'' +
    15. ", duan='" + duan + '\'' +
    16. ", type='" + type + '\'' +
    17. ", yys='" + yys + '\'' +
    18. ", bz='" + bz + '\'' +
    19. '}';
    20. }
    21. }
    22. public void show() {
    23. System.out.println(success);
    24. System.out.println(tel);
    25. ;
    26. System.out.println(info.local);
    27. System.out.println(info.duan);
    28. System.out.println(info.type);
    29. System.out.println(info.yys);
    30. System.out.println(info.bz);
    31. }
    32. @Override
    33. public String toString() {
    34. return "PhoneAddress{" +
    35. "success=" + success +
    36. ", tel='" + tel + '\'' +
    37. ", info=" + info +
    38. '}';

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

    1. public interface News_Interface {
    2. Call getNews();
    3. @GET("api/hotlist")
    4. Call getPic(@Query("pic") String type);
    5. Call getPic();
    6. }

    5.创建Retrofit实例

    5.创建网络请求接口实例

    6.发送网络请求

    7.处理返回结果

    1. private void retrofit() {
    2. //步骤4:创建Retrofit对象
    3. Retrofit retrofit=new Retrofit.Builder()
    4. .baseUrl("https://api.vvhan.com/")// 设置 网络请求 Url
    5. .addConverterFactory(GsonConverterFactory.create())//设置使用Gson解析(记得加入依赖)
    6. .build();
    7. // 步骤5:创建 网络请求接口 的实例
    8. News_Interface request=retrofit.create(News_Interface.class);
    9. //对 发送请求 进行封装
    10. Call<News> call=request.getNews();
    11. //步骤6:发送网络请求(异步)
    12. call.enqueue(new Callback<News>() {
    13. //请求成功时回调
    14. @Override
    15. public void onResponse(Call call, Response response) {
    16. Log.i("news网络请求",response.body().toString());
    17. // 步骤7:处理返回的数据结果
    18. newsAdapter.setList(response.body().getData());
    19. }
    20. //请求失败时回调
    21. @Override
    22. public void onFailure(Call call, Throwable t) {
    23. Log.i("news网络请求","失败");
    24. }
    25. });

    Retrofit+OkHTTP+RecycleView的实现步骤(小案例)

    第一步: 创建项目第

    第二步:导入依赖

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

    第三步:添加网络权限

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

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

    1.  <androidx.recyclerview.widget.RecyclerView      
    2.  android:id="@+id/rv_news"      
    3.  android:layout_width="match_parent"        
    4. android:layout_height="match_parent" />

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

    1. <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. android:layout_width="match_parent"
    4. android:layout_height="wrap_content"
    5. app:cardCornerRadius="5dp"
    6. app:cardElevation="5dp">
    7. <RelativeLayout
    8. android:layout_marginTop="20dp"
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent">
    11. <ImageView
    12. android:scaleType="fitXY"
    13. android:id="@+id/news_pic"
    14. android:layout_width="190dp"
    15. android:layout_height="200dp"
    16. app:srcCompat="@drawable/ic_launcher_background" />
    17. <TextView
    18. android:maxLines="3"
    19. android:layout_marginLeft="20dp"
    20. android:id="@+id/news_title"
    21. android:layout_toRightOf="@id/news_pic"
    22. android:layout_width="wrap_content"
    23. android:layout_height="wrap_content"
    24. android:text="TextView" />
    25. <TextView
    26. android:maxLines="5"
    27. android:layout_below="@id/news_title"
    28. android:layout_alignStart="@id/news_title"
    29. android:layout_marginTop="30dp"
    30. android:id="@+id/news_desc"
    31. android:layout_width="wrap_content"
    32. android:layout_height="wrap_content"
    33. android:text="TextView" />
    34. RelativeLayout>
    35. androidx.cardview.widget.CardView>

    第六步:创建实体类

    1. public class News {
    2. private boolean success;
    3. private String title;
    4. private String subtitle;
    5. private String update_time;
    6. private List<Data> data;
    7. public String getTitle() {
    8. return title;
    9. }
    10. public String getSubtitle() {
    11. return subtitle;
    12. }
    13. public String getUpdate_time() {
    14. return update_time;
    15. }
    16. public List<Data> getData() {
    17. return data;
    18. }
    19. public boolean isSuccess() {
    20. return success;
    21. }
    22. public void setSuccess(boolean success) {
    23. this.success = success;
    24. }
    25. public News(boolean success, String title, String subtitle, String update_time, List<Data> data) {
    26. this.success = success;
    27. this.title = title;
    28. this.subtitle = subtitle;
    29. this.update_time = update_time;
    30. this.data = data;
    31. }
    32. @Override
    33. public String toString() {
    34. return "News{" +
    35. "success=" + success +
    36. ", title='" + title + '\'' +
    37. ", subtitle='" + subtitle + '\'' +
    38. ", update_time='" + update_time + '\'' +
    39. ", data=" + data +
    40. '}';
    41. }
    42. public static class Data{
    43. private int index;
    44. private String title;
    45. private String desc;
    46. private String pic;
    47. private String hot;
    48. private String url;
    49. private String mobilUrl;
    50. public int getIndex() {
    51. return index;
    52. }
    53. public void setIndex(int index) {
    54. this.index = index;
    55. }
    56. public String getTitle() {
    57. return title;
    58. }
    59. public void setTitle(String title) {
    60. this.title = title;
    61. }
    62. public String getDesc() {
    63. return desc;
    64. }
    65. public void setDesc(String desc) {
    66. this.desc = desc;
    67. }
    68. public String getPic() {
    69. return pic;
    70. }
    71. public void setPic(String pic) {
    72. this.pic = pic;
    73. }
    74. public String getHot() {
    75. return hot;
    76. }
    77. public void setHot(String hot) {
    78. this.hot = hot;
    79. }
    80. public String getUrl() {
    81. return url;
    82. }
    83. public void setUrl(String url) {
    84. this.url = url;
    85. }
    86. public String getMobilUrl() {
    87. return mobilUrl;
    88. }
    89. public void setMobilUrl(String mobilUrl) {
    90. this.mobilUrl = mobilUrl;
    91. }
    92. }
    93. }

    第七步:创建适配器

    1. public class NewsAdapter extends RecyclerView.Adapter.ViewHolder> {
    2. private List<News.Data> list;
    3. public void setList(List<News.Data> list){
    4. this.list=list;
    5. notifyDataSetChanged();
    6. }
    7. @NonNull
    8. @Override
    9. public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    10. View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false);
    11. ViewHolder viewHolder=new ViewHolder(view);
    12. return viewHolder;
    13. }
    14. @Override
    15. public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    16. News.Data data=list.get(position);
    17. Glide.with(holder.view).load(data.getPic()).into(holder.news_pic);
    18. holder.news_title.setText(data.getTitle());
    19. holder.news_desc.setText(data.getDesc());
    20. }
    21. @Override
    22. public int getItemCount() {
    23. return list == null ? 0 : list.size();
    24. }
    25. public class ViewHolder extends RecyclerView.ViewHolder {
    26. ImageView news_pic;
    27. TextView news_title,news_desc;
    28. View view;
    29. public ViewHolder(@NonNull View itemView) {
    30. super(itemView);
    31. view=itemView;
    32. news_pic=itemView.findViewById(R.id.news_pic);
    33. news_title=itemView.findViewById(R.id.news_title);
    34. news_desc=itemView.findViewById(R.id.news_desc);
    35. }
    36. }
    37. }

    第八步:设置适配器

    1. public class MainActivity extends AppCompatActivity {
    2. private RecyclerView rv_news;
    3. private NewsAdapter newsAdapter;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.activity_main);
    8. rv_news=findViewById(R.id.rv_news);
    9. newsAdapter =new NewsAdapter();
    10. LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity.this);
    11. rv_news.setLayoutManager(layoutManager);
    12. rv_news.setAdapter(newsAdapter);
    13. retrofit();
    14. }}

    第九步:进行网络请求

    1. public interface News_Interface {
    2. @GET("api/hotlist?type=zhihuHot")
    3. Call getNews();
    4. }

    第十步:开始网络请求,并处理返回结果

    1. private void retrofit() {
    2. Retrofit retrofit=new Retrofit.Builder()
    3. .baseUrl("https://api.vvhan.com/")
    4. .addConverterFactory(GsonConverterFactory.create())
    5. .build();
    6. News_Interface request=retrofit.create(News_Interface.class);
    7. Call call=request.getNews();
    8. call.enqueue(new Callback() {
    9. @Override
    10. public void onResponse(Call call, Response response) {
    11. Log.i("news网络请求",response.body().toString());
    12. newsAdapter.setList(response.body().getData());
    13. }
    14. @Override
    15. public void onFailure(Call call, Throwable t) {
    16. Log.i("news网络请求","失败");
    17. }
    18. });
    19. }

  • 相关阅读:
    SQL游标+临时表组合查询数据
    【线程中断】什么是中断、interrupt、isInterrupted、interrupted⽅法源码解析、如何使⽤中断标识停⽌线程_JUC18
    Python语言第五章之字符串
    自动化您的Instagram帐户的程序InstaBot Pro 7.0.2
    基本 nosql 和 mongodb等数据库对比基本 nosql 和 mongodb等数据库对比
    选择工业交换机时,需要关注哪些方面的性能?
    软件著作权申请材料及申请流程?
    Computed
    学生如何利用假期提升个人能力?
    Ipadpro2020支持电容笔吗?好用的电容笔品牌排名推荐
  • 原文地址:https://blog.csdn.net/heqiang260/article/details/126310344