web-dev-qa-db-fra.com

Les méthodes de service ne peuvent pas retourner nulles. moderniser

Ceci est ma méthode dans Interface. J'appelle cette fonction mais le crash de l'application avec cette exception:

Causé par: Java.lang.IllegalArgumentException: les méthodes de service ne peuvent pas retourner void. pour la méthode 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);

Et c'est le code où j'appelle cette fonction

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) {

        }
    });
44
kundan roy

Il y a une différence en asynchrone dans Retrofit 1.9 et 2.0

/ * Synchrone dans Retrofit 1.9 * /

public interface APIService {

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

}

/ * Asynchrone dans Retrofit 1.9 * /

public interface APIService {

@POST("/list")
void loadRepo(Callback<Repo> cb);

}

Mais sur Retrofit 2.0, c'est beaucoup plus simple puisque vous pouvez déclarer avec un seul modèle

/* Retrofit 2.0 */

public interface APIService {

@POST("/list")
Call<Repo> loadRepo();

}

// Appel synchrone dans Retrofit 2.0

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

// Appel asynchrone dans 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);
}
});
87
Mehrdad Faraji

Vous pouvez toujours faire:

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

MODIFIER:

Si vous utilisez RxJava, depuis 1.1.1 vous pouvez utiliser la classe Completable .

21
rafakob

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

Veuillez passer par ce lien.

" Toutes les déclarations d'interface seront nécessaires pour renvoyer un objet à travers lequel toutes les interactions se produiront. Le comportement de cet objet sera similaire à un Future et sera de type générique (T) pour la réponse de réussite tapez. "

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

Basé sur la nouvelle version bêta de Retrofit 2.0.0 Vous ne pouvez pas spécifier le type de retour comme nul pour le rendre asynchrone

selon le code à l'intérieur de la modification ( https://github.com/square/retrofit/blob/master/retrofit/src/main/Java/retrofit/MethodHandler.Java ) il affichera une exception lorsque vous essayez l'implémentation précédente avec 2.0.0 beta

if (returnType == void.class) {
throw Utils.methodError(method, "Service methods cannot return void.");
}
4
deniz

D'après vos cours, il semble que vous utilisez Retrofit 2.0.0, qui est actuellement en version bêta. Je pense que l'utilisation d'un vide dans votre méthode de service n'est plus autorisée. Au lieu de cela, retournez Call , que vous pouvez mettre en file d'attente pour effectuer l'appel réseau de manière asynchrone.

Vous pouvez également déposer votre bibliothèque vers Retrofit 1.9.0 et remplacer votre classe Retrofit par RestAdapter.

2
Tykin