如果 View 永远不可见,我应该在 View 生命周期的什么时候取消订阅?
At what point in the View lifecycle should I unsubscribe if the View is never made visible?
我有一个视图可以使用 API 将一些文本转换为该文本的本地化版本。如果视图在布局中可见,则此方法有效,因为一旦视图被销毁,就会调用 onDetachedFromWindow()
。但是,如果视图是不可见的并且永远不会附加到 Window onDetachedFromWindow()
永远不会被调用。
我尝试在 onAttachedToWindow()
中执行本地化,但这最终导致文本无法 displayed/cut 关闭。
public class LocalisedTextView extends TextView {
@Override
protected void onFinishInflate() {
super.onFinishInflate();
setLocalisedText(label);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
subscription = null;
}
}
public void setLocalisedText(String label) {
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
subscription = null;
}
subscription = localisationService.get(label)
.observeOn(Scheduler.ui())
.subscribe(this::setText;
}
}
如果视图从未 visible/put 到 Window 上,这会导致内存泄漏。
所以我想知道处理对可能永远不会附加到 window 的视图的订阅的最佳方法是什么?
像视图这样的图形元素不应执行任何不直接影响绘图的逻辑。它不应是本地化文本,而应将本地化文本传递给它。
我有一个视图可以使用 API 将一些文本转换为该文本的本地化版本。如果视图在布局中可见,则此方法有效,因为一旦视图被销毁,就会调用 onDetachedFromWindow()
。但是,如果视图是不可见的并且永远不会附加到 Window onDetachedFromWindow()
永远不会被调用。
我尝试在 onAttachedToWindow()
中执行本地化,但这最终导致文本无法 displayed/cut 关闭。
public class LocalisedTextView extends TextView {
@Override
protected void onFinishInflate() {
super.onFinishInflate();
setLocalisedText(label);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
subscription = null;
}
}
public void setLocalisedText(String label) {
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
subscription = null;
}
subscription = localisationService.get(label)
.observeOn(Scheduler.ui())
.subscribe(this::setText;
}
}
如果视图从未 visible/put 到 Window 上,这会导致内存泄漏。
所以我想知道处理对可能永远不会附加到 window 的视图的订阅的最佳方法是什么?
像视图这样的图形元素不应执行任何不直接影响绘图的逻辑。它不应是本地化文本,而应将本地化文本传递给它。