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

OSCHINA-MIRROR/327744707-rxjava-RxLife

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

RxLife

RxLife, по сравнению с [trello/RxLifecycle], [uber/AutoDispose], имеет следующие преимущества:

  • прямая поддержка в главном потоке обратного вызова;
  • поддержка подписки на наблюдателей в дочернем потоке;
  • простота использования, низкая стоимость обучения;
  • более высокая производительность, более простая реализация.

Дружеское напоминание: используйте RxLife в сочетании с [RxHttp], так будет ещё лучше.

Подробное описание RxLife: https://juejin.im/post/5cf3e1235188251c064815f1

Gradle-подключение

Добавьте jitpack в файл build.gradle вашего проекта следующим образом:

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

Примечание: начиная с версии 2.1.0, RxLife полностью перенесён из JCenter на jitpack.

Новая версия поддерживает только проекты AndroidX.

dependencies {
   //rxjava2
   implementation 'com.github.liujingxing.rxlife:rxlife-rxjava2:2.2.2'

   //rxjava3
   implementation 'com.github.liujingxing.rxlife:rxlife-rxjava3:2.2.2'
}

Обратите внимание: для RxJava2 используйте метод Rxlife.asXxx; для RxJava3 используйте метод Rxlife.toXxx.

Для проектов, не использующих AndroidX, используйте старую версию RxLife.

implementation 'com.rxjava.rxlife:rxlife:2.0.0'

Поскольку Google прекратил обновление библиотек, не относящихся к AndroidX, в 19 году, старая версия rxlife больше не поддерживается, поэтому как можно скорее перенесите проект на AndroidX.

Использование

1. FragmentActivity/Fragment

При уничтожении FragmentActivity/Fragment автоматически закрывается канал RxJava.

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.as(this))     // В этом случае this является объектом FragmentActivity/Fragment
    .subscribe(aLong -> {
        Log.e("LJX", "accept =" + aLong);
    });

2. View

Когда View удаляется, канал RxJava автоматически закрывается.

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.as(this))  // В этом случае this относится к объекту View
    .subscribe(aLong -> {
        Log.e("LJX", "accept =" + aLong);
    });

3. ViewModel

При уничтожении Activity/Fragment канал RxJava закрывается автоматически. ViewModel должен наследовать класс ScopeViewModel следующим образом:

public class MyViewModel extends ScopeViewModel {

    public MyViewModel(@NonNull Application application) {
        super(application);
    }

    public void test(){
        Observable.interval(1, 1, TimeUnit.SECONDS)
            .as(RxLife.asOnMain(this))  // После наследования ScopeViewModel можно напрямую передать this
            .subscribe(aLong -> {
                Log.e("LJX", "MyViewModel aLong=" + aLong);
            });
    }
}

Обратите внимание: необходимо получить объект ViewModel через Activity/Fragment следующим образом, иначе RxLife не получит обратных вызовов жизненного цикла.

MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);

4. Любой класс

При уничтожении Activity/Fragment канал RxJava закрывается автоматически. Любой класс должен наследовать класс BaseScope, например, P-слой:

public class Presenter extends BaseScope {

    public Presenter(LifecycleOwner owner) {
        super(owner); // Добавить мониторинг жизненного цикла
    }

    public void test(){
        Observable.interval(1, 1, TimeUnit.SECONDS)
            .as(RxLife.as(this)) // После наследования BaseScope можно напрямую передать this
            .subscribe(aLong -> {
                Log.e("LJX", "accept aLong=" + aLong);
            });
    }
}

5. Пользователи Kotlin

Поскольку as — это ключевое слово в Kotlin, мы не можем использовать его напрямую. Вместо этого мы можем написать следующий код:

Observable.intervalRange(1, 100, 0, 200, TimeUnit.MILLISECONDS)
    .`as`(RxLife.`as`(this))
    .subscribe { aLong ->
        Log.e("LJX", "accept=" + aLong)
    }

Конечно, мало кто предпочитает такой способ написания, поэтому RxLife предоставляет более удобный способ для пользователей Kotlin:

Observable.intervalRange(1, 100, 0, 200, TimeUnit.MILLISECONDS)
    .life(this)
    .subscribe { aLong ->
        Log.e("LJX", "accept=" + aLong)
    }

Используйте оператор life вместо оператора as, остальное остаётся прежним.

6. Небольшой бонус

Оператор asOnMain

RxLife также предоставляет оператор asOnMain, который может указывать на то, что наблюдатель вызывается в основном потоке, следующим образом:

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.asOnMain(this))
    .subscribe(aLong -> {
        // Вызов в основном потоке
       Log.e("LJX", "accept =" + aLong);
    });

    // Эквивалентно
Observable.timer(5, TimeUnit.SECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .as(RxLife.as(this))
    .subscribe(aLong -> {
        // Вызов в основном потоке
        Log.e("LJX", "accept =" + aLong);
    });

Пользователи Kotlin используют lifeOnMain вместо оператора asOnMain, остальное остаётся прежним.

Обратите внимание: операторы as в классе RxLife применимы ко всем шести наблюдаемым объектам: Flowable, ParallelFlowable, Observable, Single, Maybe и Completable.

Сжатие

Как библиотека с открытым исходным кодом, RxLife может быть сжата или не сжата. Если вы не хотите, чтобы она была сжата, добавьте следующий код в файл proguard-rules.pro:

-keep class com.rxjava.rxlife.**{*;}

Комментарии ( 0 )

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

Введение

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

Обновления

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

Участники

все

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

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