服务方法不能返回void。 改造

这是我在Interface中的方法。 我调用这个函数,但应用程序崩溃与此例外:

引起:java.lang.IllegalArgumentException:服务方法不能返回void。 方法RestInterface.getOtp

//post method to get otp for login @FormUrlEncoded @POST("/store_login") void getOtp(@Header("YOUR_APIKEY") String apikey, @Header("YOUR_VERSION") String appversion, @Header("YOUR_VERSION") String confiver, @Field("mobile") String number, Callback<Model> cb); 

这是我调用这个函数的代码

 Retrofit retrofit = new Retrofit.Builder() .baseUrl(API_URL) .build(); RestInterface restApi = retrofit.create(RestInterface.class); restApi.getOtp("andapikey", "1.0", "1.0", "45545845454", new Callback<Model>() { @Override public void onResponse(Response<Model> response) { } @Override public void onFailure(Throwable t) { } }); 

1.9版本和2.0版本在asynchronous中存在差异

/ *同步改造1.9 * /

 public interface APIService { @POST("/list") Repo loadRepo(); } 

/ *改造中的asynchronous1.9 * /

 public interface APIService { @POST("/list") void loadRepo(Callback<Repo> cb); } 

但是在Retrofit 2.0上,它更简单,因为你只能用一个模式声明

 /* Retrofit 2.0 */ public interface APIService { @POST("/list") Call<Repo> loadRepo(); } 

//同步调用2.0

 Call<Repo> call = service.loadRepo(); Repo repo = call.execute(); 

//asynchronous调用2.0

 Call<Repo> call = service.loadRepo(); call.enqueue(new Callback<Repo>() { @Override public void onResponse(Response<Repo> response) { Log.d("CallBack", " response is " + response); } @Override public void onFailure(Throwable t) { Log.d("CallBack", " Throwable is " +t); } }); 

你总是可以这样做:

 @POST("/endpoint") Call<Void> postSomething(); 

编辑:

如果你使用的是RxJava,从1.1.1开始你可以使用Completable类。

https://github.com/square/retrofit/issues/297

请通过这个链接。

所有的接口声明将被要求返回一个对象,通过这个对象所有的交互都将发生,这个对象的行为类似于Future,并且对于成功响应types将是genericstypes(T)。

 @GET("/foo") Call<Foo> getFoo(); 

基于新的Retrofit 2.0.0 beta你不能指定返回types为void来使其asynchronous

根据内部翻新代码( https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/MethodHandler.java ),当您尝试使用2.0之前的实现时,它将显示exception。 0testing版

 if (returnType == void.class) { throw Utils.methodError(method, "Service methods cannot return void."); } 

基于你的类,看起来你正在使用目前处于testing阶段的Retrofit 2.0.0。 我想在你的服务方法中使用void是不允许的。 而是返回呼叫 ,您可以排队以asynchronous执行networking呼叫。

或者,将您的库下降到Retrofit 1.9.0并用RestAdapterreplace您的Retrofit类。