Сервисные методы не могут возвращать пустоту. модифицировать

Это мой метод в интерфейсе. Я вызываю эту функцию, но сбой приложения с этим исключением:

Вызвано: java.lang.IllegalArgumentException: методы службы не могут return 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

В асинхронных версиях 1.9 и 2.0 есть разница.

/* Синхронный в модификации 1.9 */

public interface APIService {

@POST("/list")
Repo loadRepo();

}

/* Асинхронный в модификации 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();

}

//Синхронный вызов при дооснащении 2.0

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

//Асинхронный вызов при дооснащении 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);
}
});

Ответ 2

Вы всегда можете сделать:

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

EDIT:

Если вы используете RxJava, начиная с 1.1.1 вы можете использовать Completable класс.

Ответ 3

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

Пожалуйста, перейдите по этой ссылке.

"Все декларации интерфейса потребуются для возврата объекта, через который будет происходить все взаимодействие. Поведение этого объекта будет похоже на будущее и будет типичным типизированным (T) для типа ответа успеха".

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

На основе новой версии Retrofit 2.0.0 вы не можете указать тип возвращаемого значения как 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.");
}

Ответ 4

Основываясь на ваших классах, похоже, что вы используете Retrofit 2.0.0, который в настоящее время находится в бета-версии. Я думаю, использование пустоты в вашем методе обслуживания больше не допускается. Вместо этого верните Call, который вы можете ввести в очередь для выполнения сетевого вызова асинхронно.

В качестве альтернативы отбросьте свою библиотеку до Retrofit 1.9.0 и замените класс Retrofit на RestAdapter.