Что такое Disposable? Зачем его используют?android-52

Что такое Disposable?

Disposable - это интерфейс в RxJava, который представляет подписку на Observable/Flowable/Single и т.д. Его основное назначение - управление жизненным циклом подписки и ресурсами.

public interface Disposable {
    void dispose();  // Прекращает подписку и освобождает ресурсы
    boolean isDisposed();  // Проверяет, была ли подписка прекращена
}

Основные причины использования Disposable

1. Управление жизненным циклом подписки

На Android особенно важно освобождать ресурсы при уничтожении Activity/Fragment:

private CompositeDisposable disposables = new CompositeDisposable();

@Override
protected void onCreate(Bundle savedInstanceState) {
    disposables.add(
        networkService.getData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(data -> updateUI(data))
    );
}

@Override
protected void onDestroy() {
    disposables.clear();  // Отменяем все подписки
    super.onDestroy();
}

2. Предотвращение утечек памяти

Неуправляемые подписки могут удерживать ссылки на Activity/Fragment, вызывая утечки памяти.

3. Контроль выполнения операций

Позволяет вручную прерывать:

  • Сетевые запросы
  • Длительные вычисления
  • Периодические задачи (например, через interval())

CompositeDisposable

Для управления множеством подписок используют CompositeDisposable:

CompositeDisposable composite = new CompositeDisposable();

Disposable d1 = observable1.subscribe();
Disposable d2 = observable2.subscribe();

composite.addAll(d1, d2);

// Отменяем все подписки одной операцией
composite.clear();

Практические сценарии использования

  1. Отмена запроса при повороте экрана:
@Override
protected void onPause() {
    if (isFinishing()) {
        disposable.dispose();
    }
}
  1. Остановка таймера:
Disposable timerDisposable = Observable.interval(1, TimeUnit.SECONDS)
    .subscribe(tick -> updateTimer());

// Когда нужно остановить:
timerDisposable.dispose();
  1. Конкурирующие запросы:
Disposable currentRequest;

void loadData(String query) {
    if (currentRequest != null && !currentRequest.isDisposed()) {
        currentRequest.dispose();  // Отменяем предыдущий запрос
    }
    currentRequest = service.search(query).subscribe(...);
}

Важные особенности

  1. После вызова dispose():

    • Подписка прекращает получать элементы
    • Ресурсы освобождаются
    • Последующие вызовы dispose() игнорируются
  2. Проверка состояния:

    • isDisposed() возвращает true, если подписка прекращена
  3. Автоматическая отписка:

    • В RxJava 2.x подписка не отменяется автоматически при завершении Observable
    • В RxJava 3.x появился autoDispose() для упрощения управления

Резюмируем:

  • Disposable - механизм контроля подписок в RxJava
  • Ключевая задача - предотвращение утечек памяти и управление ресурсами
  • На Android обязательно использовать в связке с жизненным циклом компонентов
  • CompositeDisposable упрощает управление множеством подписок
  • Правильная работа с Disposable - признак качественного RxJava-кода