在 Android 中使用 Retrofit 的简单 GET 请求

网络是移动开发的关键因素。大多数(如果不是所有)移动应用程序都在某种程度上包含网络。应用程序正在发送或接收信息。最初,开发人员在主线程中处理网络. 这使得应用程序的用户友好性降低,因为屏幕会“冻结”。

在 Honeycomb 版本发布后,主线程上的网络停止了。谷歌随后在 2013 年开发了 Volley

介绍

你可以在这里阅读我关于 Volley 的文章。

Volley 提供了更好的东西:它更快、提供更好的功能、更简单的语法等。不过,在网络方面仍有增长空间。

Square 推出了 Retrofit。

Retrofit是一个类型安全的 HTTP 网络库,用于 Android 和 Java。Retrofit 更好,因为它超级快,提供更好的功能,甚至更简单的语法。从那时起,大多数开发人员都转而使用 Retrofit 来发出 API 请求。

改造的用途

Retrofit 用于执行以下任务:

  • 它管理接收、发送和创建 HTTP 请求和响应的过程。
  • 如果存在与 Web 服务故障的连接,它会交替使用 IP 地址。
  • 它缓存响应以避免发送重复请求。
  • 改造池连接以减少延迟。
  • Retrofit 在发送错误和使应用程序崩溃之前解决问题。

改造的优势

  • 它非常快。
  • 它支持与 Web 服务的直接通信。
  • 它易于使用和理解。
  • 它支持请求取消。
  • 它支持发布请求和分段上传。
  • 它支持同步和异步网络请求。
  • 支持动态 URL。
  • 支持转换器。

改造的缺点

  • 它不支持图像加载。它需要其他库,例如GlidePicasso
  • 它不支持设置优先级。

改造中使用的类

  • 模型类 - 此类包含要从 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();
            }

        });
    }
}

这就对了!

让我们运行我们的应用程序。

在 Android 中使用 Retrofit 的简单 GET 请求

总结

我们了解到,网络是移动应用程序开发的关键因素。我们已经学习了如何使用 Retrofit 及其优缺点。

上一篇:Android Retrofit2随记


下一篇:Retrofit源码解析