为了将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/

10-10 18:30
查看更多