Retrofit 框架的学习(巨详细)

Posted 春招进大厂的梦想家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit 框架的学习(巨详细)相关的知识,希望对你有一定的参考价值。

Retrofit 框架的学习

1.Retrofit 简介

1.Retrofit是当下最热门的一个网络请求库,是基于OKhttp和HTTP协议的网络请求框架

目录

https://image.cha138.com/20210721/8a6b7e408e5b47e291d4a186c3f5772f.jpg

2.介绍

Retrofit简介
介绍一个RESTful的HTTP网络请求框架
作者Square
功能1.基于OKhttp & 遵循Restful的API设计风格; 2.通过注解配置网络请求参数; 3.支持同步/异步网络请求; 4.支持多种类型数据的解析; 5.提供对Rxjava的支持
优点功能强大;支持多种数据的解析;支持同步和异步;拓展性好;代码简洁
应用场景任何网络请求的需求场景都应该优先选择

本质过程

2.导入依赖

implementation 'com.squareup.retrofit2:retrofit:2.7.0'

3.Retrofit发起Get数据请求

1.创建一个接口api

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;

public interface API {
    //GET注解里面的参数就是一个URL,就是baseURL后面的那坨坨
    @GET("/get/text")
    Call<ResponseBody> getJson();
}

所以为什么这儿还要特意把导入的包也要放进来呢?

踩坑!!!Call这个类必须是import retrofit2.Call,别的都是错的,一定要看清楚了

2.创建一个活动,在xml文件内添加一个按钮,用来发送请求

<?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=".Retrofit.RetrofitActivity"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit get请求"
        android:textAllCaps="false"
        android:onClick="RtgetRequest"
        tools:ignore="OnClick" />

</LinearLayout>

3.最后就是.java文件内编译

public class RetrofitActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrofit);
    }

    public void RtgetRequest(View view) {
        //首先还是要创建一个Retrofit,并设置baseURL
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://10.0.2.2:9102")
                .build();
        //创建一个API,retrofit.create()参数传入一个接口
        API api = retrofit.create(API.class);
        //创建一个任务
        Call<ResponseBody> task = api.getJson();
        //异步传输,这里和OKhttp一致
        task.enqueue(new Callback<ResponseBody>() {
            private static final String TAG = "RetrofitActivity";
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.code() == HttpURLConnection.HTTP_OK) {
                    try {
                        Log.d(TAG, "onResponse: " + response.body().string());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }
}

4.运行时报错(非代码问题)?怎么解决

如果运行时候报错,在app.gradle文件下面的android{}下面添加如下代码:

 compileOptions{
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }

4.retrofit处理请求到的数据并显示到UI上

1.在xml文件上添加一个recycleview,用来显示数据;

<?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=".Retrofit.RetrofitActivity"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Retrofit get请求"
        android:textAllCaps="false"
        android:onClick="RtgetRequest"
        tools:ignore="OnClick" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/result_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

2.设置一个数据适配器器

public class RtJsonResultAdapter extends RecyclerView.Adapter<RtJsonResultAdapter.InnerHolder> {

    private List<GetTextItem.DataDTO> data = new ArrayList<>();

    @Override
    public InnerHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
        //绑定布局
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.acticity_rtjsonresult_item, parent, false);
        return new InnerHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull InnerHolder holder, int position) {
        //绑定数据
        TextView tv_name = holder.itemView.findViewById(R.id.nameid);
        TextView tv_course = holder.itemView.findViewById(R.id.courseid);
        TextView tv_id = holder.itemView.findViewById(R.id.id);

        GetTextItem.DataDTO dataDTO = data.get(position);
        tv_name.setText(dataDTO.getName());
        tv_course.setText(dataDTO.getCourseId());
        tv_id.setText(dataDTO.getId());
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    public void setData(GetTextItem getTextItem) {
        data.clear();
        data.addAll(getTextItem.getData());
        notifyDataSetChanged();
    }

    public class InnerHolder extends RecyclerView.ViewHolder {
        public InnerHolder(@NonNull @NotNull View itemView) {
            super(itemView);
        }
    }
}

3.创建一个展示子项的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/image_item"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@mipmap/ic_launcher" />

        <LinearLayout
            android:layout_marginLeft="5dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="作者姓名:"
                    android:textSize="16sp" />

                <TextView
                    android:id="@+id/name_item"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:paddingLeft="10dp"
                    android:text="xxx"
                    android:textSize="16sp" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1">

                    <TextView
                        android:id="@+id/text_courseid"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:text="课程id:"
                        android:textSize="18sp"
                        android:layout_alignParentLeft="true"/>

                    <TextView
                        android:id="@+id/courseid"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignLeft="@+id/text_courseid"
                        android:layout_marginLeft="80dp"
                        android:layout_marginTop="20dp"
                        android:textSize="16sp"
                        android:text="123" />

                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1">

                    <TextView
                        android:id="@+id/text_id"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:text="个人id:"
                        android:textSize="18sp"
                        android:layout_alignParentLeft="true"/>

                    <TextView
                        android:id="@+id/id"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignLeft="@+id/text_id"
                        android:layout_marginLeft="80dp"
                        android:layout_marginTop="20dp"
                        android:textSize="16sp"
                        android:text="123" />
                </RelativeLayout>
            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:background="#00BCD4"/>

</LinearLayout>

4.在.java文件内编写代码

public class RetrofitActivity extends AppCompatActivity {

    private RtJsonResultAdapter rtJsonResultAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrofit);
        initView();
    }

    private void initView() {
        RecyclerView recyclerView = this.findViewById(R.id.result_list);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        rtJsonResultAdapter = new RtJsonResultAdapter();
        recyclerView.setAdapter(rtJsonResultAdapter);
    }

    public void RtgetRequest(View view) {
        //首先还是要创建一个Retrofit,并设置baseURL
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.wanandroid.com")
                .build();
        //创建一个API
        API api = retrofit.create(API.class);
        Call<ResponseBody> task = api.getJson();
        task.enqueue(new Callback<ResponseBody>() {
            private static final String TAG = "RetrofitActivity";

            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.code() == HttpURLConnection.HTTP_OK) {
                    try {
                        //首先得到获取到的内容
                        String json = response.body().string();
                        Log.d(TAG, "onResponse: "+json);
                        //解析json
                        Gson gson = new Gson();
                        GetTextItem getTextItem = gson.fromJson(json,GetTextItem.classAndroid 网络请求框架之Retrofit 的 详细使用

Android 网络请求框架之Retrofit 的 详细使用

Android 网络请求框架之Retrofit 的 详细使用

Hibernate-Validator框架完成服务端参数据校验(巨详细)

(学习笔记)机器学习实战——房价预测完整案例(巨详细)

巨详细!使用OpenCV和OpenVINO轻松创建深度学习应用