RoviT+Rxjava уже является самой основной сетевой структурой на рынке. Это чрезвычайно легко использовать его для выполнения обычных сетевых запросов. Я использовал модернизацию для загрузки файлов и загрузки файлов ранее, но я обнаружил, что использование модификации для загрузки не поддерживает обратные вызовы прогресса по умолчанию, но продукт требует, чтобы прогресс загрузки отображался при загрузке файлов, поэтому я должен войти в него.
Далее, давайте инкапсулируем его вместе и используем Monhofit+Rxjava для загрузки файлов с прогрессом.
GitHub: JSdownload
Давайте сначала посмотрим на диаграмму UML:
Вы не можете быть уверены, как с этим справиться. Не волнуйтесь, давайте сделаем это шаг за шагом:
1. необходимо добавить зависимость
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: rowtipit: 2.0.0-beta4'compile 'com.squareup.retrofit2: конвертер-GSON: 2.0.0-beta4'compile' com.squareup.retrofit2: adapter-rxjava: 2.0.0-beta4 '
Обратите внимание на номер версии при его использовании
2. Напишите обратный вызов
/*** Описание: Загрузить обратный вызов прогресса* Создан JIA на 2017/11/30. * Причина, по которой люди могут это сделать, заключается в том, что они считают, что могут*/public interface jsdownloadlistener {void onstartdownload (); void OnProgress (Int Progress); void OnFinishDownload (); void onfail (строка errorInfo);}Само собой разумеется, загруженный обратный вызов должен, по крайней мере, иметь четыре метода обратного вызова: начать загружать, загружать прогресс, загрузить и загрузить неудачу.
Обратите внимание, что процент прогресса возвращается в методе программы, а причина сбоя возвращается в Onfail.
3. Перепишите тело ответа и вычислите процент загрузки
/*** Описание: Загрузчик запрос на работу с прогрессом* Создан JIA 2017/11/30. * Причина, по которой люди могут это сделать, заключается в том, что они считают, что они могут*/public class JSresponsebody Extends Ответ {Частный ответ ответа образа ответа; private jsdownloadlistener загрузка Listener; // BufferedSource - это входной поток в библиотеке Okio, который используется здесь в качестве входного потока. Частный буферизатор BufferedSource; public jsresponsebody (responsebody responsebody, jsdownloadlistener загрузка Listener) {this.Responsebody = responsebody; this.downloadlistener = загрузка Listener; } @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; / @Override public long Read (буферная раковина, длинный байтэлект) бросает ioexception {long bytesread = super.read (раковина, bytecount); // read () Возвращает количество чтения байтов или -1, если этот источник исчерпан. TotalBytesRead += BytesRead! = -1? байспич: 0; Log.e ("Скачать", "Читать:"+ (int) (totalBytesRead * 100 / responsebody.contentLength ())); if (null! = Загрузить Listener) {if (bytesRead! = -1) {загрузка listener.onProgress ((int) (totalBytesRead * 100 / responsebody.contentLength ())); }} вернуть BytesRead; }}}; }}Пропустите ответ «Ответ» и JSdownloadListener для сетевого запроса в конструкции.
Ядро здесь - это метод источника, который возвращает объект Forurningsource, где мы переопределяем его метод чтения, рассчитываем процент в методе чтения и передаем его к обратному загрузку.
4. перехватчик
Этого недостаточно, чтобы инкапсулировать только тело ответа. Ключ заключается в том, что нам нужно получить запрошенное тело ответа, здесь мы используем перехватчик.
/*** Описание: Загрузить перехватчик с прогрессом* Создан JIA 2017/11/30. * Причина, по которой люди могут это сделать, заключается в том, что они считают, что могут*/public Class JSdownloadInterceptor реализует Interceptor {private jsdownloadlister загрузка Listener; public jsdownloadInterceptor (jsdownloadListener загрузка Listener) {this.DownLoadListener = загрузка Listener; } @Override Public Response Intercept (цепь цепей) бросает ioException {response response = chain.proceed (chain.request ()); return response.newbuilder (). Body (new jsresponsebody (response.body (), загрузка списка)). build (); }}Обычно для добавления, удаления или преобразования запросов или ответов используются перехватыватели.
Возвращает тело ответа, которое мы просто инкапсулировали в перехват метода перехвата.
5. Служба сетевых запросов
/** * Описание: * Создано Цзией 2017/11/30. * Причина, по которой люди могут это сделать, заключается в том, что они считают, что могут*/public interface DownloadService {@Streaming @Get visemble <sesspectBody> Загрузить (@URL String URL);}Уведомление:
Здесь @URL должен пройти в полном URL загрузки; Вам не нужно перехватывать метод аннотации @Streaming
6. Запуск окончательного запроса
/** 1. Описание: Загрузить инструмент класс 2. Создан JIA на 2017/11/30. 3. Причина, по которой люди могут сделать это, заключается в том, что они считают, что они могут*/public class downloadutils {private Static Final String Tag = "DownloadUtils"; Private Static Final int default_timeout = 15; Частный модернизация модернизации; private jsdownloadlistener слушатель; частная строка Baseurl; Private String DownloadUrl; public DownloadUtils (String baseurl, jsdownloadlistener ulider) {this.baseurl = baseurl; this.listener = слушатель; Jsdownloadinterceptor minterceptor = new jsdownloadinterceptor (слушатель); Okhttpclient httpclient = new okhttpclient.builder () .addinterceptor (minterceptor) .retryonConnectionFailure (true) .conceTimeout (default_timeout, timeUnit.seconds) .build (); MORFIT = новый MORFIT.BUILDER () .BASEURL (BASEURL) .client (httpClient) .AddcallAdapterFactory (rxjavacalladapterFactory.create ()) .build (); } / ** * Start Download * * @param url * @param filepath * @param abcriber * / public void скачать (@nonnull String Url, окончательная строка FilePath, абонент подписчика) {alinger.onStartDownload (); // andcribeon () изменяет поток кода, прежде чем он будет называется // viserveOn (), изменяет поток кода после того, как он называется mrotfit.create (downloarservice.class) .download (url) .subscribeon (gradulers.io ()) .unsubscribeon (wardulers.io () .Map (new func1 <). InputStream Call (ответ ответа тела) {return responsebody.bytestream (); .observeon (androidschedulers.mainthread ()) .subscribe (подписчик); } / ** * Напишите поток ввода в файл * * @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 (file); байт [] b = новый байт [1024]; int len; while ((len = inputstring.read (b))! = -1) {fos.write (b, 0, len); } inputString.close (); fos.close (); } catch (filenotFoundException e) {alinger.onfail ("filenotFoundException"); } catch (ioException e) {slister.onfail ("ioException"); }}}Конечно, вам также нужно обратить внимание на каждое местоположение обратного вызова.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.