Инструмент для загрузки на основе RxJava. Поддерживает многопоточную загрузку и загрузку с возможностью возобновления, а также автоматически определяет возможность использования этих функций.
Базовый инструмент для загрузки, созданный на основе RxJava. Поддерживает многопоточную загрузку и загрузку с возможностью возобновления. Также имеет возможность работы в фоновом режиме.### Основные возможности:
transform
, который позволяет использовать оператор compose
RxJava для последовательного вызова загрузки. Для более подробного ознакомления с этим методом обратитесь к нижней части статьи.Subscription subscription = RxDownload.getInstance()
.download(url, "weixin.apk", null)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<DownloadStatus>() {
@Override
public void onCompleted() {
// Скачивание завершено
}
@Override
public void onError(Throwable e) {
// Ошибка скачивания
}
@Override
public void onNext(final DownloadStatus status) {
// Статус скачивания
}
});
```> Параметры: адрес скачивания, имя файла для сохранения, путь сохранения.
>
> Параметры `url` и `saveName` обязательны, а `savePath` — необязательный. По умолчанию файл будет сохранён в директории `/storage/emulated/0/Download/`, то есть внутреннем хранилище устройства.
2. Настройка параметров
**Доступные параметры:**
```java
Subscription subscription = RxDownload.getInstance()
.maxThread(10) // Устанавливает максимальное количество потоков
.maxRetryCount(10) // Устанавливает количество попыток повторной загрузки при сбое
.retrofit(myRetrofit) // Если требуется свой клиент Retrofit, его можно указать здесь
.defaultSavePath(defaultSavePath) // Устанавливает путь по умолчанию для загрузки
.context(this) // Автоматически устанавливает необходимый контекст
.autoInstall(true); // После завершения загрузки автоматически устанавливает файл
.download(url, savename, savepath)// Начинает загрузку
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<DownloadStatus>());
**Подсказка:**
- Каждый вызов `RxDownload.getInstance()` возвращает новый объект.
- Каждый экземпляр может иметь свои уникальные параметры, такие как максимальное количество потоков и путь по умолчанию.
- Поэтому при создании нескольких задач загрузки следует избегать создания множества экземпляров.```java
RxDownload rxDownload1 = RxDownload.getInstance()
.maxThread(5)
.maxRetryCount(10)
.defaultSavePath(defaultPath);
//Задача загрузки 1:
Subscription subscription1 = rxDownload1.download(url1, name1, null)...;
//Задача загрузки 2:
Subscription subscription2 = rxDownload1.download(url2, name2, null)...;
```RxDownload rxDownload2 = RxDownload.getInstance().maxThread(10)...;
// Задача загрузки 3:
Subscription subscription3 = rxDownload2.download(url3, name3, null)...;### 3. Сервис для загрузки
- Использует сервис для загрузки, что обеспечивает возможность загружать в фоновом режиме
- Отмена подписки не приведёт к приостановлению загрузки
- Возможность получения текущего состояния загрузки в реальном времени
- Сохранение информации о загрузках в базе данных
- Установка максимального количества одновременных загрузок, при этом лишние задачи будут ждать до тех пор, пока свободные слоты не станут доступны
```java
Subscription subscription = RxDownload.getInstance()
.download(url, null, null);
//...
//Отмена подписки приведёт к приостановке загрузки, если сервер не поддерживает возобновление загрузки, следующая загрузка начнётся заново, в противном случае она продолжится
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
// Предоставлен метод transferFrom для использования оператора Compose в RxJava
// Например, использование вместе с RxPermission
// RxPermission — это библиотека для решения проблем с правами доступа в Android 6.0, вот её адрес: [RxPermission](https://github.com/tbruyelle/RxPermissions)
subscription = RxPermissions.getInstance(mContext)
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE) // Запрос прав доступа к внешнему хранилищу
.doOnNext(new Action1<Boolean>() {
```#### 3.1 Начало загрузки и добавление в очередь загрузок
```java
RxDownload.getInstance()
.context(this)
.autoInstall(true) // Автоматическая установка после завершения загрузки
.maxDownloadNumber(3) // Установка максимального количества одновременных загрузок
.serviceDownload(url, saveName, defaultPath)
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
Toast.makeText(ServiceDownloadActivity.this, "Начало загрузки", Toast.LENGTH_SHORT).show();
}
});
Метод serviceDownload()
больше не использует широковещательные сообщения и не принимает события прогресса загрузки, поэтому нет необходимости использовать асинхронные операции или отменять подписку.
Subscription temp = mRxDownload.receiveDownloadStatus(url)
.subscribe(new Subscriber<DownloadEvent>() {
@Override
public void onCompleted() {
mDownloadController.setState(new DownloadController.Completed());
}
@Override
public void onError(Throwable e) {
Log.w("TAG", e);
mDownloadController.setState(new DownloadController.Failed());
}
@Override
public void onNext(final DownloadEvent event) {
mDownloadController.setEvent(event);
updateProgress(event);
}
// Отмена подписки приведёт к прекращению получения данных
**ПРИМЕЧАНИЯ:**
- Независимо от того началась ли загрузка или нет, можно получить события и состояние для данного URL.
- Больше не требуется отдельно читать записи о загрузках из базы данных.### Описание событий загрузки `DownloadEvent`
```java
public class DownloadEvent {
private int flag = DownloadFlag.NORMAL; // текущее состояние загрузки
private DownloadStatus downloadStatus = new DownloadStatus(); // прогресс загрузки
public int getFlag() {
return flag;
}
public DownloadStatus getDownloadStatus() {
return downloadStatus;
}
}
```
`DownloadEvent` включает метку `flag`, которая указывает на текущее состояние задачи загрузки. Существуют следующие состояния:
```java
public class DownloadFlag {
public static final int NORMAL = 9990; // еще не начата
public static final int WAITING = 9991; // ожидание начала
public static final int STARTED = 9992; // началась загрузка
public static final int PAUSED = 9993; // приостановлена
public static final int CANCELED = 9994; // отменена
public static final int COMPLETED = 9995; // завершена
public static final int FAILED = 9996; // не удалась
public static final int INSTALL = 9997; // установка (не используется)
public static final int INSTALLED = 9998; // установлена (не используется)
public static final int DELETED = 9999; // удалена
}
```
Когда событие `DownloadEvent` получено в методе `onNext(DownloadEvent event)`, его можно использовать для определения текущего состояния задачи загрузки и выполнения различных действий в зависимости от этого состояния.
### Приостановление загрузки
```java
mRxDownload.pauseServiceDownload(url).subscribe();
```
### Отмена загрузки
```java
mRxDownload.cancelServiceDownload(url).subscribe();
```
### Удаление загрузки
```java
mRxDownload.deleteServiceDownload(url).subscribe();
```### Получение всех записей загрузок
```java
mRxDownload.getTotalDownloadRecords()
.subscribe(new Action1<List<DownloadRecord>>() {
@Override
public void call(List<DownloadRecord> list) {
mAdapter.addAll(list);
}
});
```
### Получение скачанного файла
```java
File file = mRxDownload.getRealFiles(saveName, defaultPath)[0];
```
### Дополнительные возможности будут постепенно реализованы
Если у вас есть вопросы по этому проекту, приветствуем ваши issues.
### О себе
Для обсуждения этого проекта вы можете связаться со мной следующими способами:
QQ: 270362455
Gmail: ssseasonnn@gmail.com
### Лицензия
> ```
> Copyright 2016 Season.Zlc
>
> Распространяется под лицензией Apache License, Версия 2.0 ("Лицензия");
> вы можете использовать этот файл только в соответствии с Лицензией.
> Вы можете получить копию Лицензии по адресу
>
> http://www.apache.org/licenses/LICENSE-2.0
>
> В случае отсутствия требований применимого закона или письменного соглашения,
> программное обеспечение, распространяемое под Лицензией, предоставляется «как есть»,
> БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО ТИПА, как явных, так и подразумеваемых.
> Смотрите Лицензию для конкретного языка, регулирующего права и условия использования.
> ```
```
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )