webentwicklung-frage-antwort-db.com.de

Servicemethoden können nicht storniert werden. nachrüsten

Dies ist meine Methode in Interface. Ich rufe diese Funktion auf, stürze aber mit der folgenden Ausnahme ab:

Auslöser: Java.lang.IllegalArgumentException: Dienstmethoden können nicht void zurückgeben. für die Methode 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);

Und das ist der Code, in dem ich diese Funktion aufrufe

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

Bei Retrofit 1.9 und 2.0 gibt es Unterschiede bei Asynchronous

/ * Synchron in Retrofit 1.9 * /

public interface APIService {

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

}

/ * Asynchron in Retrofit 1.9 * /

public interface APIService {

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

}

Bei Retrofit 2.0 ist dies jedoch viel einfacher, da Sie nur mit einem einzigen Muster deklarieren können

/* Retrofit 2.0 */

public interface APIService {

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

}

// Synchroner Aufruf in Retrofit 2.0

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

// Asynchroner Aufruf in 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

Sie können immer tun:

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

EDIT:

Wenn Sie RxJava verwenden, können Sie seit 1.1.1 die Klasse Completable verwenden.

21
rafakob

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

Bitte gehen Sie über diesen Link.

" Alle Schnittstellendeklarationen müssen ein Objekt zurückgeben, über das alle Interaktionen stattfinden. Das Verhalten dieses Objekts ähnelt einem Future und ist für die Erfolgsantwort generisch typisiert (T) Typ. "

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

Basierend auf der neuen Betaversion von Retrofit 2.0.0 Sie können den Rückgabetyp nicht als ungültig angeben, um ihn asynchron zu machen

gemäß dem Code in Retrofit ( https://github.com/square/retrofit/blob/master/retrofit/src/main/Java/retrofit/MethodHandler.Java ) wird bei Ihnen eine Ausnahme angezeigt Versuchen Sie die vorherige Implementierung mit 2.0.0 Beta

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

Aufgrund Ihrer Klassen sieht es so aus, als würden Sie Retrofit 2.0.0 verwenden, das sich derzeit in der Beta-Phase befindet. Ich denke, eine Lücke in Ihrer Servicemethode ist nicht länger zulässig. Geben Sie stattdessen Call zurück, um den Netzwerkaufruf asynchron auszuführen.

Alternativ können Sie Ihre Bibliothek in Retrofit 1.9.0 ablegen und Ihre Retrofit-Klasse durch RestAdapter ersetzen.

2
Tykin