Este artículo comparte el código específico del archivo de descarga de implementación RXJAVA de modificación para su referencia. El contenido específico es el siguiente
Este artículo usa: modernización + rxjava
1. Introducido:
// rxJava compile 'io.reactivex: rxJava: último.release' compilar 'io.reactivex: rxandroid: último.release' // network - squareUp compile 'com.squareup.ruprofit2: retrofit: último. Últimaease' Compile 'com.squareup.rréfit2: reelicito: último 'com.squareup.rrofit2: adapter-rxjava: último.release' compilar 'com.squareup.okhttp3: okhttp: último.release' compilar 'com.squareup.okhttpp3: logging-interceptor: ortom.release' Compile 'com.squareup.okhtpp3: loging-interceptor'
2. Aumentar el monitoreo de progreso de descarga:
Public Interface DownloadProgressListener {Void Update (Long Bytesread, Long ContentLength, Boolean lista);} clase pública descarga aProgressResponseBody extiende ResponseBody {Respuesta de respuesta privada de Body; Descargar privado ProgressListener ProgressListener; bufferedsource privado bufferedSource; Public downloadProgressResponseBody (Response ResponseBody, DownloadProgressListener ProgressListener) {this.ResponseBody = ResponseBody; this.ProgressListener = ProgressListener; } @Override public Mediatype ContentType () {return ResponseBody.ContentType (); } @Override public Long ContentLength () {return ResponseBody.ContentLength (); } @Override public BufferedSource Source () {if (BufferedSource == NULL) {BufferedSource = Okio.Buffer (Source (ResponseBody.Source ())); } return BufferedSource; } fuente de fuente privada (fuente de fuente) {return New ForwardingSource (fuente) {Long TotalBytesread = 0l; @Override public Long Read (fregadero de búfer, long byteCount) lanza ioexception {long bytesread = super.read (federal, bytecount); // Read () Devuelve el número de bytes leídos, o -1 si esta fuente está agotada. TotalBytesread += bytesread! = -1? bytesread: 0; if (null! = ProgressListener) {ProgressListener.Update (TotalBytesread, ResponseBody.ContentLength (), bytesread == -1); } return bytesread; }}; }} public class downloadProgressInterceptor implements Interceptor {Private downloadProgressListener Listener; Public downloadProgressInterceptor (downloadProgressListener Listener) {this.listener = oyente; } @Override Public Response Intercept (cadena de cadena) lanza IOException {Respuesta originalResponse = Chain.proced (Chain.Request ()); return originalResponse.newBuilder () .Body (nuevo descargar downloverPressResponseBody (originalResponse.body (), oyente)) .Build (); }}3. Crear clase de elemento para el progreso de descarga:
La clase pública descarga implementa parcelable {private int progress; Private Long CurrentFilesize; Private Long Totalfilesize; public int getProgress () {return progress; } public void setProgress (int progrese) {this.progress = progress; } public Long GetCurrentFilesize () {return currentFilesize; } public void setCurrentFilesize (Long CurrentFilesize) {this.CurrentFilesize = CurrentFilesize; } public Long getTotalFilesize () {return TotalFilesize; } public void settotalFilesize (Long TotalFilesize) {this.totalFilesize = TotalFilesize; } @Override public int describeContents () {return 0; } @Override public void WriteTopArcel (parcel Dest, int flags) {dest.writeInt (this.progress); dest.Writelong (this.CurrentFilesize); dest.Writelong (this.totalfilesize); } descarga pública () {} Descarga protegida (paquete en) {this.progress = in.readInt (); this.CurrentFilesize = in.ReadLong (); this.totalfilesize = in.readlong (); } public static final parcelable.creator <soding> creator = new Parcelable.creator <download> () {@Override public descarga createFromParcel (fuente de paquete) {return new download (fuente); } @Override public download [] newArray (int size) {return new download [size]; }};}4. Descargue la clase de red de archivos:
interfaz pública descargaService {@streaming @get Observable <ResponseBody> Descargar (@URL String URL);}Nota: Aquí @url es una URL de descarga completa; sin intersección
clase pública Descargarpi {String final String String Tag = "downloadApi"; Private static final int default_timeout = 15; modernización de modernización pública; Public downloadApi (String URL, DownloadProgressListener Listener) {downloadProgressInterceptor Interceptor = new DownloadProgressInterceptor (oyente); OKHTTPClient Client = new OkhttpClient.Builder () .addinterceptor (interceptor) .retryonConnectionFailure (verdadero) .ConnectTimeOut (default_timeout, timeUnit.seconds) .Build (); retrofit = new Retrofit.Builder () .Baseurl (url) .client (cliente) .addCalladapterFactory (rxJavacalladapterFactory.create ()) .Build (); } public void downloadApk (@NonNull String URL, archivo final, archivo de archivo, suscriptor de suscriptor) {log.d (etiqueta, "downloadApk:" + url); retrofit.create (descargaService.class) .download (url) .subScribeon (schedulers.io ()) .unsubscribeon (schedulers.io ()) .map (new func1 <ResponseBody, inputStream> () {@Override InputStream Call (ResponseBody de respuesta) {return Response.bytErsam ();}}) .ObServeOn (Schedulers.Computation ()) .DoonNext (nuevo Action1 <PutingStream> () {@Override public Void Call (inputStream InputStream) {try {fileUtils.WriteFile (inputStream, file);} Catch (IOException e) {}}}}}}); .observeon (AndroidSchedulers.Mainthread ()) .subscribe (suscriptor); }} Entonces se llama:
La red se realiza en el servicio
public class downloadService extiende IntentService {private static final string tag = "downloadService"; Notificación privada Compat.Builder NotificationBuilder; Notificación privada Manager NotificationManager; cadena privada apkurl = "http://download.fir.im/v2/app/install/595c5959959d6901ca0004ac?download_token=1a9dfa8f248b6e45ea46bc5ed96a0a9e&source=update";;;;; public downloadService () {super ("downloadService"); } @Override protegido nulo OnHandleIntent (intención intención) {notificationManager = (notificationManager) getSystemService (context.notification_service); NotificationBuilder = new NotificationCompat.Builder (this) .setsMallicon (r.mipmap.ic_download) .SetContentTitle ("Descargar") .SetContentText ("File de descarga") .SetAutocancel (true); NotificationManager.notify (0, NotificationBuilder.Build ()); descargar(); } private void download () {downloadProgressListener oyer = new downloadProgressListener () {@Override public void Update (Long bytesread, Long ContentLength, Boolean lista) {descargar descargar = new download (); download.settotalfilesize (contentLength); descargar.setCurrentFilesize (bytesread); int progress = (int) ((bytesread * 100) / contentLength); descargar.setProgress (progreso); sendNotification (descargar); }}; Archivo outputFile = new File (Environment.getExternalStoragePublicDirectory (entorno.directory_downloads), "file.apk"); String baseUrl = stringUtils.gethostName (apkurl); New DownloadApi (BaseUrl, Listener) .downloadApk (apkurl, outputFile, new suscriber () {@Override public void onCompleted () {downloadCompleted ();} @Override public void onError (showable e) {e.PRINTAtTRACE (); downloadCompleted (); log.e (TageRor: "(E. e.getMessage ( + E.PrintStege (); } @Override public void onNext (objeto o) {}}); } private void downloadCompleted () {descargar descargar = nuevo descargar (); descargar.setProgress (100); sendIntent (descargar); NotificationManager.Cancel (0); notificationBuilder.setProgress (0, 0, falso); notificationBuilder.SetContentText ("archivo descargado"); NotificationManager.notify (0, NotificationBuilder.Build ()); } private void sendNotification (descargar descargar) {sendIntent (descargar); notificationBuilder.setProgress (100, download.getProgress (), falso); NotificationBuilder.SetContentText (stringUtils.getDataSize (download.getCurrentFilesize ()) + "/" + stringUtils.getDataSize (download.gettotalfilesize ())); NotificationManager.notify (0, NotificationBuilder.Build ()); } private void sendIntent (descargar descargar) {intent intent = new intent (mainActivity.message_progress); intent.putextra ("descargar", descargar); LocalBroadcastManager.getInstance (descargaService.THIS) .SendBroadcast (intención); } @Override public void onTaskremoved (intent rootIntent) {NotificationManager.Cancel (0); }}Código de MainActivity:
Public Class MainActivity extiende APPCOMPATACTIVY {public static final String Message_progress = "Message_Progress"; Private AppCompatButton btn_download; Progress de progreso privado; TextView privado Progress_Text; Private BroadCastreceiver BroadCastreceiver = new BroadCastreceiver () {@Override public void onRECeive (context, intence intent) {if (intent.getAction (). Equals (message_progress)) {descargar descargar = intent.getParcelableExtra ("descargar"); progress.setProgress (download.getProgress ()); if (download.getProgress () == 100) {progress_text.setText ("File Download Complete"); } else {progress_text.setText (stringUtils.getDataSize (download.getCurrentFilesize ()) + "/" + stringUtils.getDataSize (download.gettotalfilesize ()); }}}}}}}; @Override protegido void onCreate (Bundle SaveDInStancestate) {super.oncreate (saveDInStancestate); setContentView (r.layout.activity_main); btn_download = (appCompatButton) FindViewById (R.ID.BTN_DOWNLOAD); progreso = (ProgressBar) FindViewById (R.ID.Progress); progress_text = (textView) findViewById (r.id.progress_text); RegisterReceiver (); btn_download.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View View) {intent intent = new intent (mainActivity.this, downloadService.Class); startservice (intento);}}); } private void registerReceiver () {localBroadcastManager bmanager = localBroadCastManager.getInstance (this); Intentfilter intentFilter = new IntentFilter (); IntentFilter.Addaction (Message_Progress); bmanager.RegisterReceiver (Broadcastreceiver, IntentFilter); }}Código de origen de este artículo: RetROCIT RXJAVA Implementación Descargar archivo
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.