这是我在Interface中的方法。我正在调用此函数,但应用程序崩溃时出现此异常:
引起:java.lang.IllegalArgumentException:服务方法不能 返回无效。 方法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) {
}
});
答案 0 :(得分:87)
Retrofit 1.9和2.0中的Asynchronous存在差异
/ * Retrofit 1.9 * /
中的同步public interface APIService {
@POST("/list")
Repo loadRepo();
}
/ * Retrofit 1.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();
}
// Retrofit 2.0中的同步调用
Call<Repo> call = service.loadRepo();
Repo repo = call.execute();
// Retrofit 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);
}
});
答案 1 :(得分:20)
你总是可以这样做:
@POST("/endpoint")
Call<Void> postSomething();
修改强>
如果您使用的是RxJava,那么从1.1.1开始,您可以使用Completable类。
答案 2 :(得分:4)
https://github.com/square/retrofit/issues/297
请浏览此链接。
&#34; 将需要所有接口声明来返回将通过其发生所有交互的对象。此对象的行为类似于Future,并且对于成功响应类型将是通用类型(T)。&#34;
@GET("/foo")
Call<Foo> getFoo();
基于新的Retrofit 2.0.0测试版您不能将返回类型指定为void以使其异步
根据改造中的代码(https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/MethodHandler.java),当您尝试使用2.0.0 beta时的先前实现时,它将显示异常
if (returnType == void.class) {
throw Utils.methodError(method, "Service methods cannot return void.");
}
答案 3 :(得分:2)
根据您的类,看起来您正在使用目前处于测试版的Retrofit 2.0.0。我认为不再允许在服务方法中使用void。而是返回Call,您可以将其排队以异步执行网络调用。
或者,将您的库放到Retrofit 1.9.0并用RestAdapter替换您的Retrofit类。