it-swarm.com.de

So brechen Sie die Nachrüstanforderung ab

Ich scrolle durch die offiziellen documentation von Retrofit und entscheide mich, etwas Ähnliches in meinem Projekt zu implementieren, so dass der Benutzer immer die Möglichkeit hat, die Download-Datei abzubrechen und alles richtig funktionieren würde. Implementieren Sie geeignete Methoden, wenn Sie Folgendes nicht vorschreiben:

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?");
                }
            }

Aber unterstrichen in rot isCanceled in Failure-Methode. Ich verstehe nicht, was das Problem ist, weil diese Methode ursprünglich die Klasse Call vorgeschlagen hat (vielleicht, weil ich statt der Klasse Call schwöre, ist RetrofitError?) Bitte sagen Sie mir, wie ich das Problem beheben kann und ich brauche keine Nachrüstung 2.

7
Morozov

Soweit ich mich erinnere, scheint error.isCanceled() nicht in Retrofit dabei zu sein. Wenn Sie eine Anforderung abbrechen möchten, können Sie entweder zu Retrofit 2 wechseln, wo sie über eine call.cancel()-Methode verfügen, oder in der aktuellen Version von Retrofit. Sie können die Callback-Klasse erweitern, um eine eigene Klasse CancellableCallback zu erstellen:

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

Bearbeiten

Sie können es dann so verwenden:

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

Und storniere es dann so:

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

Sie können die Anfrage wie folgt stornieren:

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

und Rückruf von Abbrechen erhalten wie:

@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?");
       }
}

Sie können hier für weitere Informationen überprüfen.

6
Pratik Butani

Sie sollten Retrofit 2 dafür verwenden und die Signatur der Schnittstellenmethode ändern, um ein Call-Objekt zurückzugeben. Um eine Anfrage auszuführen, rufen Sie die enqueue-Methode auf. Danach können Sie die cancel-Methode aufrufen, um die Anforderung abzubrechen.

0

Sie sollten zu retrofit2 wechseln und dann so etwas schreiben - 

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