网络是移动开发的关键因素。大多数(如果不是所有)移动应用程序都在某种程度上包含网络。应用程序正在发送或接收信息。最初,开发人员在主线程中处理网络
. 这使得应用程序的用户友好性降低,因为屏幕会“冻结”。
在 Honeycomb 版本发布后,主线程上的网络停止了。谷歌随后在 2013 年开发了 Volley。
介绍
你可以在这里阅读我关于 Volley 的文章。
Volley 提供了更好的东西:它更快、提供更好的功能、更简单的语法等。不过,在网络方面仍有增长空间。
Square 推出了 Retrofit。
Retrofit是一个类型安全的 HTTP 网络库,用于 Android 和 Java。Retrofit 更好,因为它超级快,提供更好的功能,甚至更简单的语法。从那时起,大多数开发人员都转而使用 Retrofit 来发出 API 请求。
改造的用途
Retrofit 用于执行以下任务:
- 它管理接收、发送和创建 HTTP 请求和响应的过程。
- 如果存在与 Web 服务故障的连接,它会交替使用 IP 地址。
- 它缓存响应以避免发送重复请求。
- 改造池连接以减少延迟。
- Retrofit 在发送错误和使应用程序崩溃之前解决问题。
改造的优势
- 它非常快。
- 它支持与 Web 服务的直接通信。
- 它易于使用和理解。
- 它支持请求取消。
- 它支持发布请求和分段上传。
- 它支持同步和异步网络请求。
- 支持动态 URL。
- 支持转换器。
改造的缺点
- 它不支持图像加载。它需要其他库,例如
Glide
和Picasso。 - 它不支持设置优先级。
改造中使用的类
- 模型类 - 此类包含要从 JSON 文件中获取的对象。
- Retrofit 实例 - 这个 Java 类用于向 API 发送请求。
- 接口类 - 此 Java 类用于定义端点。
先决条件
- 已安装Android Studio。
- 读者应该对 Java 和 XML 有初级的了解。
- 读者应该具备发出网络请求、JSON 和 REST API 的基本知识。
第 1 步 - 创建一个新的 Android 工作室项目
打开 Android Studio 并启动一个新的 Android Studio Project -> Empty Activity。选择完成并等待项目构建。
第 2 步 – 为我们的应用程序添加改造
将以下依赖项添加到您的应用级build.gradle
文件。
implementation 'com.squareup.retrofit2:retrofit:2.7.2'
implementation 'com.squareup.retrofit2:converter-gson:2.7.2'
implementation 'com.squareup.okhttp3:okhttp:3.6.0'
注意:可以根据想要使用的 JSON 添加不同的转换器。以下是一些转换器的示例:
Jackson : com.squareup.retrofit2:converter-jackson:2.1.0
Moshi : com.squareup.retrofit2:converter-moshi:2.1.0
Protobuf : com.squareup.retrofit2:converter-protobuf:2.1.0
Wire : com.squareup.retrofit2:converter-wire:2.1.0
Simple XML : com.squareup.retrofit2:converter-simplexml:2.1.0
为您的应用程序添加互联网权限。
<uses-permission android:name="android.permission.INTERNET" />
第 3 步 – 为我们的应用程序设计 UI
在这一步中,我们将为我们的应用程序设计布局。由于这是一个简单的应用程序,我们将只使用 aListView
来显示 API 的信息。
将以下代码行添加到布局资源activity_main.xml文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context=".MainActivity">
<ListView
android:id="@+id/superListView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
第 4 步 - 创建模型类
接下来,我们将创建一个包含来自 JSON 的对象的模型类。对于我们的例子,我们只想获取虚构人物的名字。
在Java目录下,右键选择new-→java class-→app/src/main/java-->class。我们将命名我们的模型类Results。
在 中添加以下代码行Results.java
:
package com.example.myapplication;
import com.google.gson.annotations.SerializedName;
public class Results {
@SerializedName("name")
private String superName;
public Results(String name) {
this.superName = name;
}
public String getName() {
return superName;
}
}
注意:SerializedName
注释应始终显示 JSON 文件中对象的确切名称。
第 5 步 - 创建改造实例
该 Java 类用于向 API 发送请求。我们指定包含所需数据的 URL 并使用Retrofit Builder
该类。
在Java目录下,右键选择new-→java class-→app/src/main/java-→class。我们将把我们的类命名为RetrofitClient。
将以下代码行添加到RetrofitClient.java
:
package com.example.myapplication;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
private static RetrofitClient instance = null;
private Api myApi;
private RetrofitClient() {
Retrofit retrofit = new Retrofit.Builder().baseUrl(Api.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
myApi = retrofit.create(Api.class);
}
public static synchronized RetrofitClient getInstance() {
if (instance == null) {
instance = new RetrofitClient();
}
return instance;
}
public Api getMyApi() {
return myApi;
}
}
第 6 步 – 定义端点
端点通常在接口类中定义。端点是指获取信息的路径。我们的终点是“奇迹”。由于我们的目标是从 API 获取信息,因此我们将使用@GET
注解,因为我们正在发出 Get 请求。
接下来,我们将拥有一个call<results>
从 API 返回信息的对象。
在Java目录下,右键选择new-->java class-->app/src/main/java-->class。我们将命名我们的接口类Api。
在 中添加以下代码行Api.java
:
package com.example.myapplication;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface Api {
String BASE_URL = "https://simplifiedcoding.net/demos/";
@GET("marvel")
Call<List<Results>> getsuperHeroes();
}
第 7 步 – 发送 GET 请求
在这一步中,我们将调用接口类中定义的每个 API 端点。接口类将使来自 API 的信息能够显示在我们的ListView
.
最后,我们将有一个onFailure
方法,Toast
如果信息没有成功加载到ListView
.
将以下代码行添加到您的 MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
ListView superListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
superListView = findViewById(R.id.superListView);
getSuperHeroes();
}
private void getSuperHeroes() {
Call<List<Results>> call = RetrofitClient.getInstance().getMyApi().getsuperHeroes();
call.enqueue(new Callback<List<Results>>() {
@Override
public void onResponse(Call<List<Results>> call, Response<List<Results>> response) {
List<Results> myheroList = response.body();
String[] oneHeroes = new String[myheroList.size()];
for (int i = 0; i < myheroList.size(); i++) {
oneHeroes[i] = myheroList.get(i).getName();
}
superListView.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, oneHeroes));
}
@Override
public void onFailure(Call<List<Results>> call, Throwable t) {
Toast.makeText(getApplicationContext(), "An error has occured", Toast.LENGTH_LONG).show();
}
});
}
}
这就对了!
让我们运行我们的应用程序。
总结
我们了解到,网络是移动应用程序开发的关键因素。我们已经学习了如何使用 Retrofit 及其优缺点。