将BaseViewModel设为BaseActivity的ViewModel有何问题?会影响性能吗?
BaseActivity绑定BaseViewModel的相关问题解答
1. 绑定操作的潜在问题
该设计本身不存在原理性错误,但如果实现不规范会引发如下常见问题:
- 类型安全风险:如果BaseActivity未使用泛型限定ViewModel类型,直接持有
BaseViewModel类的引用,子Activity调用自身专属ViewModel的独有方法时需要手动强转,很容易引发ClassCastException,后续修改ViewModel继承链时也容易漏改对应Activity的强转逻辑。
该问题可以通过泛型约束解决,将BaseActivity定义为BaseActivity<VM extends BaseViewModel>,子类继承时传入自身专属的ViewModel类型即可避免强转操作。 - 职责边界臃肿:如果将非通用的业务逻辑都放入BaseViewModel中,会导致父类冗余代码过多,部分不需要对应逻辑的子Activity也会被迫持有无关的方法与变量,违背单一职责原则。仅建议在BaseViewModel中存放所有Activity通用的逻辑,比如全局loading状态控制、通用错误提示处理等。
- 生命周期泄漏风险:如果在BaseViewModel中注册了全局观察者、事件总线监听,却没有和BaseActivity的生命周期做关联解绑,很容易出现内存泄漏,或者子Activity销毁后仍收到无效事件的问题。
2. 性能影响说明
只要实现规范,该方案几乎不会产生额外的性能损耗:
- ViewModel本身的实例化成本极低,即便是多继承了一层BaseViewModel,类加载的开销可以忽略不计,不会对页面启动速度造成可感知的影响。
- 唯一可能引发性能问题的场景是:BaseViewModel中持有了大量仅少数页面会用到的大内存对象,导致所有子页面都被迫占用不必要的内存。只要做好BaseViewModel的职责拆分,仅存放通用逻辑,就不会出现性能问题。
内容的提问来源于stack exchange,提问作者Karim Hamed
相关产品推荐
相关产品推荐

