建议的实现方式是通过使用对象到活动、片段和视图ViewModel
来公开变化的数据。LiveData
在某些情况下,当LiveData
不是一个理想的答案或根本没有答案时。
自然的替代方法是将观察者模式应用于ViewModel
,使其成为可观察的。当向 注册观察者时ViewModel
,ViewModel
将持有回调引用以通知观察者。
文档说,aViewModel
不得包含对活动、片段或视图的引用。我发现“为什么”这个问题的唯一答案是,这可能会导致内存泄漏。那么如何清理引用以避免内存泄漏呢?
对于视图,这是一个困难。当视野消失时,没有明确的时刻。但是活动和片段具有定义的生命周期。所以有些地方可以取消注册为观察员。
你怎么看?ViewModels
如果您注意始终取消注册活动,那么将活动注册为观察者是否有效?您是否找到有关此问题的任何有效信息?
我为最佳答案设置了一个小奖励。这不是因为我认为它是推荐的解决方案(因为它不适用于视图)。我只想知道并扩展我的选择。
public class ExampleViewModel extends ViewModel {
public interface OnEndListener {
public void onEnd();
}
private List<OnEndListener> onEndListeners = new ArrayList<>();
public void setOnEndListener(OnEndListener onEndListener) {
onEndListeners.add(onEndListener);
}
public void removeOnEndListener(OnEndListener onEndListener) {
onEndListeners.remove(onEndListener);
}
public void somethingHappens() {
for (OnEndListener onEndListener: new ArrayList<OnEndListener>(onEndListeners) ) {
onEndListener.onEnd();
}
}
}
public class ExampleActivity extends AppCompatActivity {
ExampleViewModel exampleViewModel;
ExampleViewModel.OnEndListener onEndListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onEndListener = new ExampleViewModel.OnEndListener() {
@Override
public void onEnd() {
finish();
}
};
exampleViewModel = ViewModelProviders.of(this).get(ExampleViewModel.class);
exampleViewModel.setOnEndListener(onEndListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
exampleViewModel.removeOnEndListener(onEndListener);
}
}