服务方法不能返回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类。