1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/season92-RxDownload

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Этот проект больше не обновляется на Gitee, перейдите на GitHub для просмотра: https://github.com/ssseasonnn/RxDownload

RxDownload

Инструмент для загрузки на основе RxJava. Поддерживает многопоточную загрузку и загрузку с возможностью возобновления, а также автоматически определяет возможность использования этих функций.

Описание

Базовый инструмент для загрузки, созданный на основе RxJava. Поддерживает многопоточную загрузку и загрузку с возможностью возобновления. Также имеет возможность работы в фоновом режиме.### Основные возможности:

  • Использует Retrofit + OKHTTP для выполнения сетевых запросов.
  • Создан на основе RxJava, поддерживает цепочки вызовов различных операторов RxJava.
  • В случае, если сервер поддерживает загрузку с прерыванием, используется многопоточная загрузка с прерыванием.
  • Если сервер не поддерживает загрузку с прерыванием, используется традиционная загрузка.
  • Поддерживает многопоточную загрузку, можно установить максимальное количество потоков, значение по умолчанию — три потока.
  • Автоматическое повторное соединение при ошибке сети, можно настроить максимальное количество попыток повторного соединения, значение по умолчанию — три попытки.
  • Использует Java NIO MappedByteBuffer для эффективной записи и чтения файлов.
  • Поддерживает потоковую загрузку, что позволяет избежать утечки памяти даже при работе с большими файлами.
  • Автоматически проверяет изменения файла на сервере по метке Last-Modified.
  • При проверке целостности данных использует легковесный метод HEAD для получения только заголовков ответа, снижая объем передаваемых данных.### Обновление от 7 ноября 2016 года:
  • Устранена проблема с невозможностью загрузки при использовании пользовательского пути.

Обновление от 9 ноября 2016 года:

  • Добавлен метод transform, который позволяет использовать оператор compose RxJava для последовательного вызова загрузки. Для более подробного ознакомления с этим методом обратитесь к нижней части статьи.

Обновление от 17 ноября 2016 года:

  • Выпущена версия 1.2.0.
  • Поддерживается работа в фоновом режиме.
  • Возможность получения прогресса загрузки.
  • Интегрирована система управления загрузками.
  • Подробнее о способах использования см. документацию.

Обновление от 24 ноября 2016 года:

  • Отменено использование бродкаста в предыдущих версиях.
  • Упрощён процесс использования фоновой загрузки.
  • Возможность установки максимального количества задач загрузки, остальные задачи будут ждать своей очереди.
  • Устранены проблемы с возможностью повторной загрузки одного и того же URL.
  • Подробнее о способах использования см. документацию.

Обновление от 25 ноября 2016 года:

  • Устранены несколько проблем.
  • Добавлена возможность автоматического запуска установки APK после завершения загрузки, настройка доступна в параметрах конфигурации.
  • Подробнее о способах использования см. демо-версию.### Примеры экранов
### Схема процесса скачивания
### Способ использования #### 1. Подготовительные работы 1. Добавьте зависимость Gradle [ ! [Загрузка](https://api.bintray.com/packages/ssseasonnn/android/RxDownload/images/download.svg) ](https://bintray.com/ssseasonnn/android/RxDownload/_latestVersion) ```groovy dependencies { compile 'zlc.season:rxdownload:1.2.2' } ``` 2. Настройте права доступа ```xml ``` > **Примечание:** Для версий Android 6.0 и выше также требуется запрос прав доступа во время выполнения. В случае ошибок при скачивании, проверьте наличие необходимых прав.

2. Обычное скачивание

  • Недоступность фонового скачивания
  • Отмена подписки приводит к прекращению скачивания1. Способ использования
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() больше не использует широковещательные сообщения и не принимает события прогресса загрузки, поэтому нет необходимости использовать асинхронные операции или отменять подписку.

3.2 Получение событий загрузки и состояний загрузок

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 )

Вы можете оставить комментарий после Вход в систему

Введение

На основе RxJava создан инструмент для скачивания, поддерживает многопоточность и продолжение передачи после разрыва соединения. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/season92-RxDownload.git
git@api.gitlife.ru:oschina-mirror/season92-RxDownload.git
oschina-mirror
season92-RxDownload
season92-RxDownload
master