为了将json响应映射到pojo,我们通常会这样做
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
用户是我的Pojo类。
但是对于其他每个请求,我都需要制作不同的pojo并编写相同的代码进行改造调用。我想制作一个用于调用api的方法,并将相应的pojo类传递给改造调用。像这样
ApiCalls api = retrofit.create(ApiCalls.class);
Call<*ClassPassed*> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<*ClassPassed*>() {
//Response and failure callbacks
}
所以现在我可以将任何pojo类都变为单个方法并获得响应。这只是为了避免一次又一次地重写相同的代码。这可能吗
更新
详细说明:
假设我需要提出两个请求。第一个是获取userDetails,另一个是PatientDetails.So,我必须创建两个模型类User和Patient。
因此,在翻新api中,我将遇到类似这样的情况
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
@POST
Call<Patient> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
在我的FragmentUser和FragmentPatient类中,我将这样做
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
ApiCalls api = retrofit.create(ApiCalls.class);
Call<Patient> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<Patient>() {
//Response and failure callbacks
}
但是这里的代码只是由于不同的pojo类而重新出现。我需要针对不同的请求在其他所有片段中重复相同的代码。
因此,我需要制作一个通用方法,在该方法中它可以接受任何pojo类,然后从片段中,我将只传递要映射的pojo。
最佳答案
有两种方法可以执行此操作.........
1.泛型
2.将所有POJO合并为一个......
在泛型中,您必须将方法与类一起传递。请看例子...
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
callRetrofit(call,1);
public static <T> void callRetrofit(Call<T> call,final int i) {
call.enqueue(new Callback<T>() {
@Override
public void onResponse(Call<T> call, Response<T> response) {
if(i==1){
User user = (User) response.body(); // use the user object for the other fields
}else if (i==2){
Patient user = (Patient) response.body();
}
}
@Override
public void onFailure(Call<T> call, Throwable t) {
}
});
}
注:-在翻新调用上方,将您的响应转换到
YOUR OBJECT
中,因此您可以访问其字段和方法这是非常容易使用 。您必须将所有POJO类合并为一个,并在Retrofit中使用它们。请看下面的例子....
在Login API中,我得到了这样的JSON响应...
JSON上方的,POJO看起来像这样
public class LoginResult{
private String message;
private boolean success;
//constructor , getter and setter
}
和Retrofit调用看起来像这样.....
call.enqueue(new Callback<LoginResult>() {
@Override
public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
}
@Override
public void onFailure(Call<LoginResult> call, Throwable t) {
}
});
在用户API中,我得到了这样的JSON响应.. 。
JSON上方的,POJO看起来像这样
public class UserResult{
private String name;
private String place;
//constructor , getter and setter
}
和Retrofit调用看起来像这样.....
call.enqueue(new Callback<UserResult>() {
@Override
public void onResponse(Call<UserResult> call, Response<UserResult> response) {
}
@Override
public void onFailure(Call<UserResult> call, Throwable t) {
}
});
只需将以上两个JSON响应合并为一个.....
public class Result{
private String name;
private String place;
private String message;
private boolean success;
//constructor , getter and setter
}
并在您的API调用中使用结果......
call.enqueue(new Callback<Result>() {
@Override
public void onResponse(Call<Result> call, Response<Result> response) {
}
@Override
public void onFailure(Call<Result> call, Throwable t) {
}
});
注意:-您直接组合了2个POJO类并对其进行访问。 (如果您的响应非常大,并且如果某些KEY与不同的Variable类型相同,则提供重复信息,这将非常复杂)
关于android - Android:动态传递模型类以进行回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40903498/