web-dev-qa-db-fra.com

Comment annuler une demande de modification

Je fais défiler la documentation officielle de Retrofit et décide de mettre en œuvre quelque chose comme ceci dans mon projet, de sorte que l'utilisateur puisse toujours annuler le fichier téléchargé et que tout fonctionnerait correctement. Mettre en œuvre des méthodes appropriées, où l'échec de prescrire ce qui suit:

service.upload1(file1, str, stringMap, new Callback<ImageUpload>() {
            @Override
            public void success(final ImageUpload imageUpload, Response response) {
                mRecyclerView.post(new Runnable() {
                    @Override
                    public void run() {
                        ...
                });
            }

            @Override
            public void failure(RetrofitError error) {
                if (error.isCanceled()) {
                    Log.e(TAG, "request is cancelled");
                } else {
                    Log.e(TAG, "other larger issue, i.e. no network connection?");
                }
            }

Mais souligne en rouge isCanceled dans la méthode de l'échec. Je ne comprends pas quel est le problème, car cette méthode avait initialement été proposée à la classe Call (peut-être parce que jure devant moi au lieu de la classe Call is RetrofitError?) Je n'ai pas besoin d'aller sur la rénovation 2.

7
Morozov

error.isCanceled() ne semble pas être présent dans la modification, pour autant que je m'en souvienne. Si vous souhaitez pouvoir annuler une demande, vous pouvez passer à Retrofit 2 où ils ont une méthode call.cancel() ou dans la version actuelle de Retrofit, vous pouvez étendre la classe Callback pour créer votre propre classe CancellableCallback comme ceci:

public class CancellableCallback<T> implements Callback<T> {

    private Callback<T> callback;

    private boolean canceled;

    private CancellableCallback() {}

    public CancellableCallback(Callback<T> callback) {
        this.callback = callback;
        canceled = false;
    }

    public void cancel() {
        canceled = true;
        callback = null;
    }

    @Override
    public void success(T o, Response response) {
        if (!canceled) {
            callback.success(o, response);
        }
    }

    @Override
    public void failure(RetrofitError error) {
        if (!canceled) {
            callback.failure(error);
        }
    }
}

Modifier

Vous pouvez ensuite l'utiliser comme ceci:

CancellableCallback callback = new Callback<ImageUpload>() {
            @Override
            public void success(final ImageUpload imageUpload, Response response) {
                mRecyclerView.post(new Runnable() {
                    @Override
                    public void run() {
                        ...
                });
            }

            @Override
            public void failure(RetrofitError error) {

            }
    };

service.upload1(file1, str, stringMap, callback);

Et puis annulez comme ceci:

if (some condition && callback != null) {
    callback.cancel();
}
16
Amit Tiwari

Vous pouvez annuler une demande comme:

// something happened, for example: user clicked cancel button
service.cancel();  

et obtenez le rappel de Annuler comme:

@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
       if (call.isCanceled()) {
           Log.e(TAG, "request was cancelled");
       }
       else {
           Log.e(TAG, "other larger issue, i.e. no network connection?");
       }
}

Vous pouvez vérifier ici pour plus.

6
Pratik Butani

Vous devez utiliser Retrofit 2 pour cela et modifier la signature de la méthode d'interface pour renvoyer un objet Call. Pour faire une demande, vous appelez la méthode enqueue. Ensuite, vous pouvez appeler la méthode cancel pour annuler la demande.

0
Marius Kaunietis

Vous devriez passer à retrofit2, puis écrire quelque chose comme ceci - 

service.upload1(file1, str, stringMap, new Callback<ImageUpload>() {
        @Override
        public void onResponse(Call<ImageUpload> call, Response<Topics> response) {

            //retrieve your resbonse body here like this -
            //   ImageUpload imageUpload = response.body();
            mRecyclerView.post(new Runnable() {
                @Override
                public void run() {
                    ...
            });
        }

        @Override
        public void onFailure(Call<ImageUpload> call, Throwable t) {
            if (call.isCanceled()) {
                Log.e(TAG, "request is cancelled");
            } else {
                Log.e(TAG, "other larger issue, i.e. no network connection?");
            }
        }
0
Devansh Kumar