Retrofit + Rxjava est déjà le cadre de réseau le plus grand public sur le marché. Il est extrêmement facile de l'utiliser pour faire des demandes de réseau ordinaires. J'ai utilisé Retrofit pour télécharger des fichiers et télécharger des fichiers avant, mais j'ai constaté que l'utilisation de Retrofit to Download ne prend pas en charge les rappels de progression par défaut, mais le produit nécessite que la progression de téléchargement s'affiche lors du téléchargement de fichiers, donc je dois y aller.
Ensuite, encapsulons-le ensemble et utilisons Retrofit + Rxjava pour télécharger des fichiers avec Progress.
github: jsdownload
Jetons un coup d'œil au diagramme UML en premier:
Vous ne savez peut-être pas comment y faire face. Ne vous inquiétez pas, faisons-le pas à pas:
1. Il est nécessaire d'ajouter une dépendance
compiler 'io.reactivex: rxjava: 1.1.0'compile' io.reactivex: rxandroid: 1.1.0'compile 'com.squareup.retrofit2: rétrofit: 2.0.0-beta4'compile' com.squareup.retrofit2: rétrofit: 2.0.0 beta4 ' 'com.squareup.RetRofit2: Converter-GSON: 2.0.0-beta4'compile' com.squareup.retrofit2: adapter-rxjava: 2.0.0-beta4 '
Faites attention au numéro de version lorsque vous l'utilisez
2. Écrivez un rappel
/ ** * Description: Téléchargez le rappel Progress * créé par Jia le 2017/11/30. * La raison pour laquelle les gens peuvent le faire est parce qu'ils croient qu'ils peuvent * / interface publique jsdownloadListener {void onStartDownload (); void onProgress (int progress); void onFinishDownload (); void onfail (String errorInfo);}Inutile de dire que le rappel téléchargé devrait au moins avoir quatre méthodes de rappel: commencer à télécharger, télécharger des progrès, télécharger l'achèvement et télécharger l'échec.
Notez que le pourcentage de progrès est retourné dans la méthode ONPROGRESS et que la raison de l'échec est retournée dans ONFAIL.
3. Réécrivez Responsebody et calculez le pourcentage de téléchargement
/ ** * Description: Télécharger le corps de la demande avec progression * créé par Jia le 2017/11/30. * La raison pour laquelle les gens peuvent le faire est qu'ils croient qu'ils peuvent * / classe publique JSResponsebody étend ResponseBody {private ResponseBodyBodyBody; JSDownloadListener privé DownloadListener; // BufferedSource est le flux d'entrée de la bibliothèque OKIO, qui est utilisé ici comme une intrigue. BufferedSource privé BufferedSource; public JSResponseBody (réponse ResponseBody, jsdownloadListener DownloadListener) {this.ResponseBody = ResponseBody; this.downloadListener = téléchargement; } @Override public MediaType ContentType () {return réponsebody.contentType (); } @Override public long contentLength () {return réponsebody.contentLength (); } @Override public BufferedSource Source () {if (BufferedSource == NULL) {BufferedSource = okio.buffer (source (ResponseBody.Source ())); } RETOUR BufferedSource; } Source privée Source (source Source) {return new Forwardingource (source) {long totalBytesRead = 0l; @Override public Long Read (tampon tampon, long byteCount) lève ioException {long bytesRead = super.read (swel, byteCount); // read () Renvoie le nombre d'octets lecture, ou -1 si cette source est épuisée. TotalBytesRead + = bytesRead! = -1? BytesRead: 0; Log.e ("Download", "Read:" + (int) (TotalBytesRead * 100 / ResponseBody.ContentLength ())); if (null! = downloadListener) {if (bytesRead! = -1) {downloadListener.onprogress ((int) (totalBytesRead * 100 / réponsebody.contentLength ())); }} return bytesRead; }}}; }}Passez la réponse et JSDownloadListener pour la demande de réseau dans la construction.
Le noyau ici est la méthode source, qui renvoie l'objet de transfert de transfert, où nous employons sa méthode de lecture, calculons le pourcentage dans la méthode de lecture et le transmettons au rappel DownloadListener.
4. Interceptor
Il ne suffit pas de résumer uniquement lebody. La clé est que nous devons obtenir la réponse demandée, nous utilisons ici l'intercepteur.
/ ** * Description: Téléchargez l'interceptor avec progrès * créé par Jia le 2017/11/30. * La raison pour laquelle les gens peuvent le faire est qu'ils croient qu'ils peuvent * / classe publique jsdownloadInterceptor implémente interceptor {private jsdownloadListener downloadListener; public jsdownloadInterceptor (jsdownloadListener DownloadListener) {this.downloadListener = DownloadListener; } @Override La réponse publique Intercept (chaîne de chaîne) lève ioException {réponse réponse = chain.proceed (chain.request ()); return réponse.newBuilder (). Body (new JSResponseBody (Response.Body (), DownloadListener)). Build (); }}Normalement, les intercepteurs sont utilisés pour ajouter, supprimer ou convertir des informations d'en-tête de demande ou de réponse.
Renvoie le corps de réponse que nous venons d'encapsuler dans l'interception de la méthode d'interception.
5. Service de demande de réseau
/ ** * Description: * Créé par Jia le 2017/11/30. * La raison pour laquelle les gens peuvent le faire est parce qu'ils croient qu'ils peuvent * / interface publique DownloadService {@Streaming @get Observable <Sponsebody> Télécharger (@Url String URL);}Avis:
Ici @url doit passer dans l'URL de téléchargement complet; Vous n'avez pas besoin d'intercepter la méthode d'annotation @Streaming
6. La demande finale commence
/ ** 1. Description: Télécharger la classe des outils 2. Créé par Jia le 2017/11/30. 3. La raison pour laquelle les gens peuvent le faire est qu'ils croient qu'ils peuvent * / classe publique DownloadUtils {private static final string tag = "downloadutils"; private static final int default_timeout = 15; Rétrofice de rénovation privée; Écouteur privé jsdownloadListener; String Private String BasiseUrl; Téléchargement de chaîne privée; Public DownloadUtils (String BustanL, JSownloadListener Écouteur) {this.baseurl = bundingl; this.Listener = écouteur; JsdownloadInterceptor mineterceptor = new jsdownloadInterceptor (écouteur); Okhttpclient httpclient = new okhttpclient.builder () .AddInterceptor (Minterceptor) .retryConnectionFailure (true) .connectTimeout (default_timeout, timeunit.seconds) .build (); Retrofit = new RESTOFIT.BUILDER () .BASEURL (BUSURL) .Client (httpClient) .AddCalladapterFactory (rxjavacalladapterFactory.create ()) .build (); } / ** * Démarrer Télécharger * * @param URL * @param filepath * @param abonné * / public void download (@Nonnull String URL, final String filepath, abonné abonné) {écouteur auditeur.OnStartDoLot (); // abonceoneon () modifie le thread du code avant qu'il ne soit appelé // ObserveOn () modifie le thread du code après qu'il s'appelle RetroFit.Create (DownloadService.Class) .Download (URL) .Subscribeon (Schedulers.io ()) .UNSUBSCRECH appel (réponse réponse) {return réponsebody.bytestream ();}}) .obServeOn (schedUlers....putation ()) // Utilisé pour calculer le task.DoonNext (new Action1 <putStream> () @Override public Void Call (InputStream InputStream) {WriteFile (InputStream, FilePath);}}) .ObServeon (AndRoidschedulers.Mainthread ()) .Subscribe (abonné); } / ** * Écrivez le flux d'entrée dans le fichier * * @param inputString * @param filepath * / private void writeFile (inputStream inputString, String FilePath) {file file = new File (filepath); if (file.exists ()) {file.delete (); } FileOutputStream fos = null; try {fos = new FileOutputStream (fichier); octet [] b = nouveau octet [1024]; int len; while ((len = inputString.read (b))! = -1) {fos.write (b, 0, len); } inputString.close (); fos.close (); } catch (filenotfoundException e) {auditer.onfail ("filenotfoundException"); } catch (ioException e) {auditer.onfail ("ioException"); }}}Bien sûr, vous devez également faire attention à chaque emplacement du rappel de téléchargement.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.