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

时间:2015-08-31 12:40:23

标签: retrofit

这是我在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) {

        }
    });

4 个答案:

答案 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类。