Rense+Rxjava ist bereits das gängigste Netzwerkrahmen auf dem Markt. Es ist extrem einfach, es zu verwenden, um gewöhnliche Netzwerkanforderungen zu erstellen. Ich habe nach Restrofit verwendet, um Dateien hochzuladen und Dateien herunterzuladen, aber ich habe festgestellt, dass die Verwendung von Ringrofit zum Herunterladen standardmäßig keine Fortschritts -Callbacks unterstützt. Das Produkt erfordert jedoch, dass der Download -Fortschritt beim Herunterladen von Dateien angezeigt wird. Daher muss ich mich darauf einlassen.
Lassen Sie es uns als nächstes zusammenschließen und verwenden Sie Retrofit+Rxjava, um Dateien mit Fortschritt herunterzuladen.
GitHub: Jsdownload
Schauen wir uns zuerst das UML -Diagramm an:
Möglicherweise sind Sie nicht sicher, wie Sie damit umgehen sollen. Machen Sie sich keine Sorgen, nehmen wir es Schritt für Schritt an:
1. Es ist notwendig, Abhängigkeit hinzuzufügen
compile 'io.reactivex:rxjava:1.1.0'compile 'io.reactivex:rxandroid:1.1.0'compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'compile 'com.SquareUp.Retrofit2: Converter-Gson: 2.0.0-Beta4'Compile' com.squareup.retrofit2: adapter-rxjava: 2.0.0-beta4 '
Achten Sie bei der Verwendung auf die Versionsnummer
2. Schreiben Sie einen Rückruf
/*** Beschreibung: Fortschrittsrückruf herunterladen* Erstellt von JIA am 2017/11/30. * Der Grund, warum Menschen dies tun können, ist, dass sie glauben, dass sie*/öffentliche Schnittstelle jsDownloadListener {void onStartDownload (); void on progress (int progress); void onfinishdownload (); void onfail (String errorinfo);}Unnötig zu erwähnen, dass der heruntergeladene Rückruf mindestens vier Rückrufmethoden haben sollte: Herunterladen, Herunterladen von Fortschritt, Herunterladen von Fertigstellung und Download -Fehler.
Beachten Sie, dass der Fortschrittsprozentsatz in der On -Progress -Methode zurückgegeben wird und der Fehlergrund in Onfail zurückgegeben wird.
3. Schreiben Sie Response Body um und berechnen Sie den Download -Prozentsatz
/*** Beschreibung: Laden Sie die Anfrage mit Fortschritt herunter* Erstellt von JIA am 2017/11/30. * Der Grund, warum Menschen es tun können, ist, dass sie glauben, dass sie*/öffentliche Klasse JSResponseBody erweitern können ResponseBody {private responseBody responseBody; private jsDownloadListener downloadListener; // BufferedSource ist der Eingabestream in der OKIO -Bibliothek, der hier als InputStream verwendet wird. private bufferedSource bufferedSource; public JSResponseBody (Antwortbody ResponseBody, JsDownLoadListener DownloadListener) {this.ResponseBody = Antwortbodus; this.downloadListener = downloadListener; } @Override public mediType contentType () {return responseBody.contentType (); } @Override public long contentLength () {return responseBody.contentLength (); } @Override public bufferedSource Source () {if (bufferedSource == null) {bufferedSource = oKIO.Buffer (Quelle (ResponseBody.Source ())); } return bufferedSource; } private Quelle Source (Quelle Quelle) {neuer Weiterleitung (Quelle) {Long TotalByTesRead = 0L; @Override public Long Read (Buffer Sink, Long byteCount) löst ioException {long byteRead = super.read (Sink, ByteCount) aus; // read () gibt die Anzahl der Lesebytes zurück oder -1, wenn diese Quelle erschöpft ist. TotalByTesRead += ByteSread! = -1? BytesRead: 0; Log.e ("download", "read:"+ (int) (TotalByTesRead * 100 / Antwortbody.ContentLength ())); if (null! = downloadListener) {if (byteSread! }} return bytesread; }}}; }}Übergeben Sie den ResponseBody und JsDownloadListener für die Netzwerkanforderung im Konstrukt.
Der Kern hier ist die Quellmethode, die das ForwardingSource -Objekt zurückgibt, bei dem wir die Lesemethode überschreiben, den Prozentsatz in der Lesemethode berechnen und an den Callback -DownloadListener weitergeben.
4. Interceptor
Es reicht nicht aus, Reaktionsbody zu verkörpern. Der Schlüssel ist, dass wir den angeforderten Antwortkörper erhalten müssen. Hier verwenden wir den Interceptor.
/*** Beschreibung: Download Interceptor mit Fortschritt* Erstellt von JIA am 2017/11/30. * Der Grund, warum Menschen dies tun können, ist, dass sie glauben, dass sie*/public class JsDownLoadInterceptor implementiert Interceptor {private jsDownLoadListener downloadListener; public JsDownloadInterceptor (jsDownLoadListener downloadListener) {this.downloadListener = downloadListener; } @Override public response intercept (Chain Chain) löscht IOException {response response = chain.procece (chain.request ()); return response.newbuilder (). body (new JsResponseBody (response.body (), downloadListener)). Build (); }}Normalerweise werden Interceptors verwendet, um Anforderungs- oder Antwort -Header -Informationen hinzuzufügen, zu entfernen oder zu konvertieren.
Gibt den ResponseBody zurück, den wir gerade im Intercept -Methode -Intercept eingekapselt haben.
5. Netzwerkanforderungsdienst
/** * Beschreibung: * Erstellt von JIA am 2017/11/30. * Der Grund, warum Menschen dies tun können, ist, dass sie glauben, dass sie*/öffentliche Schnittstelle DownloadService {@streaming @get Observable <AnsseeBody> Download (@url String url);};}Beachten:
Hier soll @url die vollständige Download -URL übergeben. Sie müssen die @Streaming -Annotationsmethode nicht abfangen
6. Der endgültige Antragsstart
/** 1. Beschreibung: Download -Werkzeugklasse 2. Erstellt von JIA am 2017/11/30. 3. Der Grund, warum Menschen es tun können, ist, dass sie glauben, dass sie*/öffentliche Klasse DownloadUtils {private statische endgültige String -Tag = "DownloadUtils"; private statische endgültige int default_timeout = 15; private Nachrüstgeräte; private JsDownloadListener -Listener; private String baseUrl; private String downloadurl; public downloadUtils (string baseUrl, jsDownLoadListener -Listener) {this.baseUrl = BaseUrl; this.Listener = Hörer; JsDownloadInterceptor minterceptor = new JsDownLoadInterceptor (Listener); Okhttpclient httpclient = new Okhttpclient.builder () .AdDInterceptor (minterceptor) .retryonConnectionFailure (true) .ConnectTimeout (default_timeout, timeUnit.seconds) .build (); Retrofit = new Retrofit.builder () .baseURL (BaseUrl) .Client (httpclient) .addcalladapterFactory (rxjavaCalladapterFactory.create ()) .build (); } / ** * Download starten * * @param url * @param filepath * @param subscriber * / public void download (@nonnull String -URL, endgültige String -Filepath, Abonnenten -Abonnent) {listener.onstartDownload (); // subcribingon () ändert den Thread des Codes, bevor er nennt // obsegnon () den Thread des Codes ändert, nachdem er retrofit.create (downloadService.class). Download (url) .Subscribeon (Schedulers.io ()) .unsubscribeon (Schedulers.io). call (responseBody responseBody) {return responseBody.ByTestream (); .OBSERVEON (Androidschedulers.mainThread ()) .Subscribe (Abonnent); } / ** * Schreiben Sie den Eingabestream in die Datei * * @param inputString * @param filepath * / private void writefile (inputStream inputString, String filepath) {Dateidatei = new Datei (filepath); if (file.exists ()) {file.delete (); } FileOutputStream fos = null; try {fos = new FileOutputStream (Datei); Byte [] B = neues Byte [1024]; Int len; while ((len = inputString.read (b))! = -1) {fos.write (b, 0, len); } inputString.close (); fos.close (); } catch (FilenotFoundException e) {listener.onfail ("filenotFoundException"); } catch (ioException e) {listener.onfail ("ioException"); }}}Natürlich müssen Sie auch auf jeden Ort des Download -Callbacks achten.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.