Question Les méthodes de service ne peuvent pas être annulées. rénovation


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

Causée par: java.lang.IllegalArgumentException: les méthodes de service ne peuvent pas   retour nul.       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) {

        }
    });

42
2017-08-31 12:40


origine


Réponses:


Il existe une différence d'asynchrone dans Retrofit 1.9 et 2.0

/ * Synchronous in 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 ne pouvez déclarer qu'avec un seul motif

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

84
2017-09-16 16:34



Vous pouvez toujours faire:

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

MODIFIER:

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


19
2017-12-17 17:54



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

S'il vous plaît passer par ce lien.

"Toutes les déclarations d'interface seront nécessaires pour renvoyer un objet par lequel toute interaction se produira. Le comportement de cet objet sera similaire à celui d'un futur et sera générique (T) pour le type de réponse de succès."

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

Basé sur la nouvelle version 2.0.0 de Retrofit Vous ne pouvez pas spécifier le type de retour comme étant vide pour le rendre asynchrone

selon le code à l'intérieur de retrofit (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 la version 2.0.0 bêta

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

4
2017-09-03 08:45



Selon vos classes, il semble que vous utilisiez 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 Appel, 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
2017-09-02 03:06