Disposable
- это интерфейс в RxJava, который представляет подписку на Observable/Flowable/Single и т.д. Его основное назначение - управление жизненным циклом подписки и ресурсами.
public interface Disposable {
void dispose(); // Прекращает подписку и освобождает ресурсы
boolean isDisposed(); // Проверяет, была ли подписка прекращена
}
На 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();
}
Неуправляемые подписки могут удерживать ссылки на Activity/Fragment, вызывая утечки памяти.
Позволяет вручную прерывать:
Для управления множеством подписок используют CompositeDisposable
:
CompositeDisposable composite = new CompositeDisposable();
Disposable d1 = observable1.subscribe();
Disposable d2 = observable2.subscribe();
composite.addAll(d1, d2);
// Отменяем все подписки одной операцией
composite.clear();
@Override
protected void onPause() {
if (isFinishing()) {
disposable.dispose();
}
}
Disposable timerDisposable = Observable.interval(1, TimeUnit.SECONDS)
.subscribe(tick -> updateTimer());
// Когда нужно остановить:
timerDisposable.dispose();
Disposable currentRequest;
void loadData(String query) {
if (currentRequest != null && !currentRequest.isDisposed()) {
currentRequest.dispose(); // Отменяем предыдущий запрос
}
currentRequest = service.search(query).subscribe(...);
}
После вызова dispose()
:
dispose()
игнорируютсяПроверка состояния:
isDisposed()
возвращает true, если подписка прекращенаАвтоматическая отписка:
autoDispose()
для упрощения управленияDisposable
- механизм контроля подписок в RxJavaCompositeDisposable
упрощает управление множеством подписок