为什么我们使用带有改造的呼叫列表

why do we use a call list with retrofit

我有一个例子,我想了解一些部分,在这个例子中,它工作正常,但是当我改变部分 从: call list<model>> method(); 到: call <model> method();

导致错误,请问是什么原因? 这两种情况有什么区别?

// MainActivity :
public class MainActivity extends AppCompatActivity {



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

            GetData service = RetrofitClient.getRetrofitInstance().create(GetData.class);

            Call<RetroUsers> call = service.getAllUsers();

            call.enqueue(new Callback<RetroUsers>() {
                @Override
                public void onResponse(Call<RetroUsers> call, Response<RetroUsers> response) {
                    Log.i("print", "" + response.body().getUser());
                }

                @Override
                public void onFailure(Call<RetroUsers> call, Throwable t) {
                    Log.i("print", "Dont" + t.getMessage());
                }
            });

        }



    ///Error message :
    I/print: Dontjava.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $


    // interface GetData:
    public interface GetData {
        @GET("/users")
        Call<RetroUsers>getAllUsers();
        /*
        @GET("/users")
        Call<List<RetroUsers>> getAllUsers();
        */
    }

    // RetrofitClient :
    public class RetrofitClient {

        private static Retrofit retrofit;
        private static final String BASE_URL = "https://jsonplaceholder.typicode.com";


        public static Retrofit getRetrofitInstance() {
            if (retrofit == null) {
                retrofit = new retrofit2.Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
            }
            return retrofit;
        }
    }



       // model class :

        public class RetroUsers {

            @SerializedName("name")
            private String name;


            public RetroUsers(String name) {
                this.name = name;

            }

            public String getUser() {
                return name;
            }

            public void setUser(String name) {
                this.name = name;
            }



        }

这个:Call<RetroUsers> getAllUsers();

会导致错误,因为 getAllUsers() 会 return 多条 RetroUsers 记录。因此,它需要您为其提供类型 List,以便将其数据类型设置为 List,然后它可以处理多个记录。

通过核心基础知识 Java 以更好地理解这一点。

在一种情况下,您告诉反序列化器您期望一个 Model,在另一种情况下,您告诉它期望一个模型列表,也就是List<Model>。根据您实际获得的数据,您需要使用一个或另一个。 当然,您可以 "hide" 模型中的 List<...> 不使用 List<Model> 但:

public class MoreThanOneModel {
    public List<Model> entries;
    ...
}

但这并没有改变潜在的推理。