goldze / MVVMHabit

👕基于谷歌最新AAC架构,MVVM设计模式的一套快速开发库,整合Okhttp+RxJava+Retrofit+Glide等主流模块,满足日常开发需求。使用该框架可以快速开发一个高质量、易维护的Android应用。
Apache License 2.0
7.6k stars 1.69k forks source link

为什么activity调用viewmodel中的耗时任务不会产生内存泄漏?vm不会隐性持有activity的强引用吗 #81

Closed wanwanlc closed 4 years ago

mlp1995 commented 4 years ago

Activity停止的时候 viewModel 不是也销毁了吗 .. 可以选择在viewModel的onCleared 方法中 取消 耗时操作啊

wanwanlc commented 4 years ago

viewmodel有耗时任务的话不能立即销毁吧,耗时操作如何取消呢?假如线程中的for大数循环。实际vm确实不会内存泄漏,只是不知道原理。

mlp1995 commented 4 years ago

viewModel 不是感知Activity的生命周期的吗 你的耗时操作在子线程 直接把子线程关掉就行吧 . 而且 viewModel 没有持有Activity的实例吧..

wanwanlc commented 4 years ago

就像是activity中启动一个匿名类耗时线程Thread,activity退出时,Thread未结束就会导致内存泄漏。子线程能直接关掉吗?for大数循环如何关掉呢,一般不都是静态内部类+弱引用解决内存泄漏问题,但vm中就不用解决内存泄漏,不知道原理。

zjxuzhj commented 4 years ago

不是在onclear中取消耗时任务了么。。那怎么还会持有act,还会内存泄漏。

wanwanlc commented 4 years ago

取消了任务会立即停止吗

wanwanlc commented 4 years ago

原来viewmodel是静态变量的变量,不会隐式持有activity强引用