为什么我们使用带有改造的呼叫列表
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;
...
}
但这并没有改变潜在的推理。
我有一个例子,我想了解一些部分,在这个例子中,它工作正常,但是当我改变部分
从:
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;
...
}
但这并没有改变潜在的推理。