Fetch — это простая, мощная и настраиваемая библиотека менеджера загрузки файлов для Android.
Простой и удобный API.
Непрерывная загрузка в фоновом режиме.
Поддержка одновременной загрузки.
Возможность приостанавливать и возобновлять загрузку.
Установите приоритет загрузки.
Поддержка загрузки для конкретной сети.
Возможность повторить неудачную загрузку.
Возможность группировать загрузки.
Легкое отслеживание прогресса и статуса.
Загрузите отчет об оставшемся времени (ETA).
Загрузка отчетов о скорости.
Сохраняйте и получайте информацию о загрузке в любое время.
Поддержка уведомлений.
Платформа доступа к хранилищу, поставщик контента и поддержка URI.
И еще...
Если вы сохраняете загрузки за пределами изолированной программной среды вашего приложения, вам необходимо добавить следующие разрешения на хранение в манифест вашего приложения. Для Android SDK версии 23(M) и выше вам также потребуется явно запросить эти разрешения у пользователя.
Также, как вы собираетесь использовать Интернет для скачивания файлов. Нам нужно добавить разрешения на доступ в Интернет в манифесте.
Использовать Fetch легко! Просто добавьте зависимость Gradle в файл build.gradle вашего приложения.
реализация "com.tonyodev.fetch2:fetch2:3.0.12"
Использование AndroidX:
реализация "androidx.tonyodev.fetch2:xfetch2:3.1.6"
Затем получите экземпляр Fetch и запросите загрузку.
общественный класс TestActivity расширяет AppCompatActivity {частное Fetch fetch; @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = новый FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(3) .строить(); выборка = Fetch.Impl.getInstance(fetchConfiguration); Строка URL = "http:www.example.com/test.txt"; Строковый файл = "/downloads/test.txt"; окончательный запрос запроса = новый запрос (url, файл); request.setPriority(Priority.HIGH); request.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); fetch.enqueue(request, updateRequest -> { //Запрос успешно поставлен в очередь для загрузки. }, error -> { //Произошла ошибка при постановке запроса в очередь. }); } }
Отслеживать ход и статус загрузки с помощью Fetch очень легко. Просто добавьте FetchListener в свой экземпляр Fetch, и прослушиватель будет получать уведомления при каждом изменении статуса или хода загрузки.
FetchListener fetchListener = new FetchListener() { @Override public void onQueued(@NotNull Download download, boolean waitOnNetwork) { if (request.getId() == download.getId()) { showDownloadInList(download); } } @Override public void onCompleted(@NotNull Download download) { } @Override public void onError(@NotNull Download download) { Ошибка error = download.getError(); } @Override public void onProgress(@NotNull Download download, long etaInMilliSeconds, long downloadedBytesPerSecond) { if (request.getId() == download.getId()) { updateDownload(download, etaInMilliSeconds); } Int Progress = download.getProgress(); } @Override public void onPaused(@NotNull Download download) { } @Override public void onResumed(@NotNull Download download) { } @Override public void onCancelled(@NotNull Download download) { } @Override public void onRemoved(@NotNull Скачать скачать) { } @Override public void onDeleted(@NotNull Download download) { } };fetch.addListener(fetchListener);//Удалить прослушиватель, когда закончите.fetch.removeListener(fetchListener);
Fetch поддерживает приостановку и возобновление загрузки с использованием идентификатора запроса. Идентификатор запроса — это уникальный идентификатор, который сопоставляет запрос с загрузкой выборки. Загрузка, возвращаемая Fetch, будет иметь идентификатор, соответствующий идентификатору запроса, с которого началась загрузка.
Запрос request1 = новый запрос(url, файл);Запрос request2 = новый запрос(url2, file2);fetch.pause(request1.getId()); ...fetch.resume(request2.getId());
Вы можете запросить Fetch информацию о загрузке несколькими способами.
// Запрашиваем все загрузкиfetch.getDownloads(new Func>() { @Override public void call(List расширяет Download> downloads) { //Здесь доступны все загрузки } });//Получить все загрузки с помощью statusfetch.getDownloadsWithStatus(Status.DOWNLOADING, new Func
>() { @Override public void call(List расширяет Download> downloads) { //Доступ к загрузкам которые загружают } });// Вы также можете получить доступ к сгруппированным загрузкам. groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List расширяет Download> downloads) { / /Доступ к сгруппированным загрузкам } });
Когда вы закончите работу с экземпляром Fetch, просто отпустите его.
//выполняем workfetch.close();//выполняем дополнительную работу
По умолчанию Fetch использует клиент HttpUrlConnection через HttpUrlConnectionDownloader для загрузки запросов. Добавьте следующую зависимость Gradle в build.gradle вашего приложения, чтобы вместо этого использовать OkHttp Downloader. При необходимости вы можете создать свои собственные загрузчики. Подробности смотрите в документации Java.
реализация "com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12"
Использование AndroidX:
реализация "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6"
Настройте загрузчик OkHttp для Fetch.
OkHttpClient okHttpClient = новый OkHttpClient.Builder().build();FetchConfiguration fetchConfiguration = новый FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(10) .setHttpDownloader(новый OkHttpDownloader(okHttpClient)) .build();Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
Если вы хотите воспользоваться преимуществами функций RxJava2 при использовании Fetch, добавьте следующую зависимость gradle в файл build.gradle вашего приложения.
реализация "com.tonyodev.fetch2rx:fetch2rx:3.0.12"
Использование Androidx:
реализация "androidx.tonyodev.fetch2rx:xfetch2rx:3.1.6"
RxFetch позволяет очень легко ставить в очередь запросы на загрузку и загружать запросы с помощью функциональных методов rxJava2.
FetchConfiguration fetchConfiguration = новый FetchConfiguration.Builder(this).build();Rxfetch rxFetch = RxFetch.Impl.getInstance(fetchConfiguration);rxFetch.getDownloads() .asFlowable() .subscribe(new Consumer>() { @Override public void Accept(List
downloads) выдает исключение { //Доступ к результатам } }, new Consumer () { @Override public void Accept(Throwable throwable) throws Exception { //Произошла ошибка Final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
Представляем FetchFileServer. FetchFileServer — это легкий TCP-файловый сервер, который действует как файловый сервер HTTP, разработанный специально для обмена файлами между устройствами Android. Вы можете разместить файловые ресурсы с помощью FetchFileServer на одном устройстве и вам придется получать файлы с сервера на другом устройстве. Дополнительную информацию см. в примере приложения. Wiki на FetchFileServer будет добавлен в ближайшие дни.
Начните использовать FetchFileServer, добавив зависимость gradle в файл build.gradle вашего приложения.
реализация "com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12"
Использование AndroidX:
реализация "androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6"
Запустите экземпляр FetchFileServer и добавьте файлы ресурсов, которые он сможет обслуживать подключенных клиентов.
общественный класс TestActivity расширяет AppCompatActivity {FetchFileServer fetchFileServer; @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = новый FetchFileServer.Builder(это) .строить(); fetchFileServer.start(); //прослушиваем клиентские соединения File file = new File("/downloads/testfile.txt"); FileResource fileResource = новый FileResource(); fileResource.setFile(file.getAbsolutePath()); fileResource.setLength(file.length()); fileResource.setName("testfile.txt"); fileResource.setId(UUID.randomUUID().hashCode()); fetchFileServer.addFileResource(fileResource); } @Override protected void onDestroy() { super.onDestroy(); fetchFileServer.shutDown (ложь); } }
Загрузить файл с FetchFileServer с помощью Fetch очень просто.
общественный класс TestActivity расширяет AppCompatActivity {Fetch fetch; @Override protected void onCreate(@Nullable Bundle saveInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = новый FetchConfiguration.Builder(this) .setFileServerDownloader(new FetchFileServerDownloader()) //необходимо установить загрузчик файлового сервера .строить(); выборка = Fetch.Impl.getInstance(fetchConfiguration); fetch.addListener(fetchListener); Строковый файл = "/downloads/sample.txt"; Строковый URL = новый FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //IP и порт файлового сервера .setFileResourceIdentifier("testfile.txt") //имя или идентификатор ресурса файла .создавать(); Запрос запроса = новый запрос (url, файл); fetch.enqueue(request, request1 -> { //Запрос поставлен в очередь для загрузки }, error -> { //Ошибка при постановке в очередь загрузки }); } @Override protected void onResume() { super.onResume(); fetch.addListener(fetchListener); } @Override protected void onPause() { super.onPause(); fetch.removeListener(fetchListener); } @Override protected void onDestroy() { super.onDestroy(); выборка.закрыть(); } Частный FetchListener fetchListener = новый AbstractFetchListener () { @Override public void onProgress(@NotNull Download download, long etaInMilliSeconds, long downloadedBytesPerSecond) { super.onProgress(download, etaInMilliSeconds, downloadedBytesPerSecond); Log.d("TestActivity", "Прогресс: " + download.getProgress()); } @Override public void onError(@NotNull Download download) { super.onError(download); Log.d("TestActivity", "Ошибка: " + download.getError().toString()); } @Override public void onCompleted(@NotNull Download download) { super.onCompleted(download); Log.d("TestActivity", "Завершено"); } }; }
Перенесите загрузки из Fetch1 в Fetch2 с помощью помощника по миграции. Добавьте следующую зависимость gradle в файл build.gradle вашего приложения.
реализация "com.tonyodev.fetchmigrator:fetchmigrator:3.0.12"
Использование Androidx:
реализация "androidx.tonyodev.fetchmigrator:xfetchmigrator:3.1.6"
Затем запустите Мигратор.
if (!didMigrationRun()) { //Миграция должна выполняться в фоновом потоке new Thread(new Runnable() { @Override public void run() { try { Final ListTransferDownloads = FetchMigrator.migrateFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE: //TODO: обновить внешние ссылки идентификаторов для (DownloadTransferPair); переданныйDownload : переданныйDownloads) { Log.d("newDownload", переданныйDownload.getNewDownload().toString()); Log.d("oldId в Fetch v1", переданныйDownload.getOldID() + ""); } FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun (истина); //Настройка и запуск Fetch2 после миграции } catch (SQLException e) { e.printStackTrace(); } } }).начинать(); } else { //Настройка и запуск Fetch2 в обычном режиме }
Fetch может стать лучше, только если вы внесете свой вклад в код. Нашли ошибку? Сообщите об этом. У вас есть идея, которую вы хотели бы увидеть в Fetch? Внесите свой вклад в проект!
Copyright (C) 2017 Tonyo Francis. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.