服务方法不能返回void。Retrofit。

47

这是我在接口中的方法。我调用了这个函数,但应用程序崩溃并出现以下异常:

Caused by: java.lang.IllegalArgumentException: 服务方法不能返回 void。 for method 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) {

        }
    });

我已经在Retrofit 2.0上创建了一篇文章。如果还有人遇到这个问题,请查看此链接:Retrofit 2.0 android - kundan roy
5个回答

87

在Retrofit 1.9和2.0中的异步有所不同。

/* 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);
}
});

25

你可以随时这样做:

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

编辑:

如果您正在使用RxJava,自1.1.1版本起,您可以使用Completable类。


5
请查看此链接:https://github.com/square/retrofit/issues/297 “所有接口声明都需要返回一个对象,通过该对象进行所有交互。该对象的行为类似于Future,并且将具有通用类型(T)以表示成功响应类型。”
@GET("/foo")
Call<Foo> getFoo();

基于新的Retrofit 2.0.0 beta版本,你不能指定返回类型为void,以使其异步化。

根据Retrofit内部的代码(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
根据您的类,看起来您正在使用目前处于beta版本的Retrofit 2.0.0。我认为在您的服务方法中使用void已不再被允许。相反,请返回Call,您可以将其排队以异步执行网络调用。或者,将您的库降级到Retrofit 1.9.0,并使用RestAdapter替换您的Retrofit类。

1
只需在远程数据源(API、服务和端点接口)的函数中添加“suspend”关键字即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接