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