Retrofit.Callback的success()和failure()在同一活动中有两个接口实现的情况下



我目前正在编写一个连接到服务器以发出POST请求的应用程序。出于这个原因,我为各种网络操作创建了多个改装接口。我有一个执行注册的:我获取用户名、电子邮件等,发出POST请求,然后作为最后的参数,我有一次回调(RegistrationResult是一个POJO,它接受类变量中的"成功"或"失败")。这个界面看起来像这样:

public interface RegistrationInterface {
    @FormUrlEncoded
    @POST("/api/apiregistration.php")
    void connect(@Field("country") String country,
            @Field("state") String state, @Field("email") String email, 
            @Field("pwd") String password,
            Callback<RegistrationResult> resp);
}

现在,因为我将使用GCM进行推送通知,所以我有另一个接口,它将特定设备的注册id发送到服务器,并再次获得响应。这个界面看起来是这样的:

public interface SendRegIDInterface {
    @FormUrlEncoded
    @POST("/api/apiregid.php")
    void connect(@Field("reg_id") String reg_id,
    Callback<RegIDResult> resp);
}

到目前为止,一切都很好。当我试图在同一个类中创建两个接口的实现时,问题就出现了。假设我有一个Activity,出于某种原因,它应该使用来自两个接口的实现。所以我有这个:

public class MessageActivity extends Activity implements Callback {
 public void onCreate(Bundle firebug) {
 RestAdapter restAdapter1 = new RestAdapter.Builder().setEndpoint(endpoint).build();
 RegistrationInterface regInter = restAdapter1.create(RegistrationInterface.class);
 regInter.connect(// parameters here, MessageActivity.this);
 RestAdapter restAdapter2 = new RestAdapter.Builder().setEndpoint(endpoint).build();
 SendRegIDInterface regIDInter = restAdapter2.create(SendRegIDInterface.class);
 regIDInter.connect(reg_id, MessageActivity.this); 

  }


@Override
    public void failure(RetrofitError arg0) {
    }
    @Override
    public void success(Object arg0, Response arg1) {
}
}

我的问题是:改装.回调接口的重写方法(失败和成功)对应在哪里?由于我在同一个"活动"中有两个改装接口的实现,我如何区分返回的内容,例如success()方法?Callback的success()方法的参数中包含的是RegistrationInterface实现的响应还是SendRegIDInterface的响应?只要我在活动中只有RegistrationInterface接口的实现,一切都很清楚:success()方法的参数包含服务器对注册请求的响应。现在我正在使用第二个接口实现(SendRegIDInterface),我非常困惑!

还是我完全错了?

我认为您需要更多的分隔。如果你想在你的活动中放置回调,那么业务逻辑会把UI相关的事情搞得一团糟。

当我使用Reform时,我是这样做的(将用代码演示):首先,我有一个RegistrationClient.java,在这里我定义了API的所有端点:

public interface RegistrationClient {
    @FormUrlEncoded
    @POST("/api/apiregistration.php")
    void connect(@Field("country") String country,
            @Field("state") String state, @Field("email") String email, 
            @Field("pwd") String password,
            Callback<RegistrationResult> resp);
}

在这种情况下,它只是一个端点,但在某些情况下,会有更多端点,例如:

  1. GET /persons/{id}
  2. POST /persons/
  3. PUT /persons/{id}

当我得到我的客户端时,我会为接口创建一个模型。在你的情况下,我将其命名为RegistrationModel

public class RegistrationModel {
  private RegistrationClient _client;
  public RegistrationModel() {
    RestAdapter restAdapter = new RestAdapter.Builder() ... // create an adapter
    _client = restAdapter.create(RegistrationClient.class);
  }
  public void connect(String country, String state, String email, String password) { 
    // you can add an additional callback parameter for returning info to the caller.
    _client.connect(country, state, email, password, new Callback<RegistrationResult> {
      @Override
      public void failure(RetrofitError error) {
        // Do the essential things, and do a callback to the caller if needed
      }
      @Override
      public void success(RegistrationResult result, Response response) {
        // Do the essential things, and do a callback to the caller if needed
      }
   }
}

然后,我将使用自己的服务定位器或使用依赖注入(使用Dagger)来保存对每个模型的单例引用。因此,从你的活动来看,电话应该是这样的:

...
ServiceLocator.getRegistrationModel().connect(country, state, email, password);
...

或者,如果您添加了自己的回调:

...
ServiceLocator.getRegistrationModel().connect(country, state, email, password,
  new RegistrationCallback(boolean result) {
  // do something.
  }
);
...

相关内容

  • 没有找到相关文章

最新更新