J'ai une MultipartPostRequest avec une fonctionnalité de comptage de progression implémentée dans la méthode getBody()
. Donc, je montre la progression dans la barre de notification. Et lorsque l'utilisateur clique sur la notification indiquant la progression, elle devrait être annulée, un peu comme la façon dont Facebook l'implémente.Une requête peut-elle être annulée lorsqu'elle est déjà dans la méthode getBody()?
J'ai essayé d'utiliser Request.cancel()
sur l'objet Request actuel, et RequestQueue.cancelAll(Object tag)
mais la demande n'est toujours pas annulée. J'ai lu qu'une demande en cours ne peut pas être annulée, mais dans ce cas, il est encore juste dans la méthode getBody()
, donc je pense (je ne suis pas vraiment sûr) il devrait être annulé à droite? Comme j'ai également enregistré le retour de la méthode isCancelled()
et oui il renvoie vrai lorsque la notification est cliquée, et le journal est appelé dans la méthode qui renvoie la progression de la demande de téléchargement, ce qui signifie qu'il est dans la méthode getBody()
.
Mais étonnamment, et frustrant, la demande continue malgré tout car elle renvoie toujours un résultat!
Y a-t-il un moyen de contourner cela? Ou y a-t-il un moyen de l'implémenter comme Facebook? Je donnerai volontiers une prime pour cela quand je le pourrai.
J'utilise la classe de cette réponse: https://stackoverflow.com/a/28144660/1744379
En raison de certaines circonstances, je ne peux pas partager mon code. Mais la classe est exactement ce que j'ai utilisé avec lequel j'ai juste fait quelques ajustements mineurs. Le placement du CountingOutputStream
est le même que le CountingOutputStream
et le MultipartPostProgressListener
. Ainsi, le Log
qui vérifie la méthode isCancelled
est à l'intérieur de la méthode transferred
que je mis en œuvre dans un Service
Salut! Est-ce que ma réponse fonctionne pour votre question? – BNK
Salut désolé le client a abandonné l'idée. Mais non, la réponse n'a malheureusement pas fonctionné. Ce qui a fonctionné, c'est qu'à la fin de la méthode getBody(), j'ai vérifié si la requête est déjà annulée par la méthode 'isCancelled' et ensuite je donnerais un' byte [] 'vide à la requête en laissant le serveur retourner un erreur pour moi et je le laisserais en silence –
Dans mon projet d'exemple, lorsque cancelUpload appelé, le fichier a cessé de télécharger dans environ 3-5 secondes plus tard. Bien sûr, les données téléchargées sur le serveur restent toujours là (par exemple, un fichier de 2 Mo sera téléchargé environ 1 Mo) – BNK