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 的 详细使用