我在我的应用中使用Android架构组件中的ViewModel。在ViewModel中,我使用RxJava2订阅,并在订阅后保留Disposable
对象。之前,当我在Activity
中执行此操作时,我习惯于在Disposable
中处理onDestroy()
- 以避免内存泄漏:
@Override
protected void onDestroy() {
disposable.dispose();
super.onDestroy();
}
何时以及如何在ViewModel
处理它?我真的需要这样做吗?
答案 0 :(得分:14)
使用onCleared方法
apply
答案 1 :(得分:1)
您可以使用LiveDataReactiveStreams#fromPublisher(Publisher<T>)
并在视图模型中公开生成的LiveData
,而不是在视图模型中进行订阅和处理。
例如:
public class ExampleViewModel {
private static final long TIME_FOR_ANSWER = 1000;
private static final long DELAY = 25;
private final LiveData<Long> remainingTime;
ExampleViewModel() {
long start = 0;
long count = TIME_FOR_ANSWER / DELAY + 1;
Flowable<Long> flowable =
Flowable.intervalRange(start, count, 0, DELAY, TimeUnit.MILLISECONDS)
.map(i -> TIME_FOR_ANSWER - DELAY * i);
remainingTime = LiveDataReactiveStreams.fromPublisher(flowable);
}
public LiveData<Long> getRemainingTime() {
return remainingTime;
}
}
答案 2 :(得分:0)
您应该在@Override
protected void onCleared () {
disposable.dispose();
super.onCleared ();
}
中执行此操作,因为只有在onPause()
或onDestroy()
被销毁时才会调用Activity
。当您向其添加新视图并继续从Fragment
接收数据时,它可以在堆栈上生效,但是当屏幕上没有视图时,应调用ViewModel
。