[问题] static context 的问题

楼主: minesos520 (!!!)   2017-11-07 17:07:05
想请教
若 static 的view 持有 context
会有memory leak的问题
那反过来
如果一般 View 带入 static 的 context
会有相同的问题吗?
会因为引用 static 的 context
导致无法被回收吗?
感谢!
作者: ab18282099 (poppopjack)   2017-11-07 17:33:00
static的Context基本上就有可能会memory leak了
作者: lnmlee   2017-11-07 17:37:00
static 最好不要用在 基本型态跟String 以外的物件
楼主: minesos520 (!!!)   2017-11-07 18:43:00
因为架构是一个acticity叠fragment,所以acticity基本上不会死所以用static方便使用,只是不确定这样带入toast或dialog会不会有影响
作者: ssccg (23)   2017-11-07 18:49:00
memory leak这件事是持有别的物件的reference,会导致被参照的物件不会被回收,反过来就没有差但是context只有application是static,activity即使只有一个,每次系统重建也都是不同的物件,不是同一个如果用static reference存activity,那在更新此reference前不管被指到的activity是死是活都不会被回收,也是种leak
作者: lnmlee   2017-11-07 19:07:00
在Fragment 里 new View(getActivity()); 就能解决原po的问题 Fragment 有个 getActivity(); method 可以找父层Activity Context
楼主: minesos520 (!!!)   2017-11-07 19:18:00
嗯嗯我知道,只是好奇New view(static context)的话,view会因此不被回收吗?
作者: lnmlee   2017-11-07 20:16:00
你可以用debug mode 追看看我的理解是Activity lifecycle 让 context 指向 null 而连带所有 使用的view 被指向 null 最后就是垃圾车来收垃圾了
作者: ssccg (23)   2017-11-07 21:06:00
不是指向null,GC是从特定root物件(如stack、static变量)出发,所有能到达的物件就视为使用中,无法到达的就会被清掉View里有变量指向static物件,但View自己没被使用中的物件指到的话,还是会清掉。Activity是使用中时系统会保持一个参考,在结束时会释放,但另外有static变量指向Activity就会造成系统已不用的Activity不会被清掉View在没有另外用变量存的情况下,通常指向它的只有上一层的View,在被移除出View hierarchy时就可以被清掉了
作者: lnmlee   2017-11-07 21:59:00
所以context 就是一个追踪是否连着root物件 以利于GC thread 启动时ㄧ起内存初始化 的媒介对吧?
作者: twntwn   2017-11-11 15:29:00
不会

Links booklink

Contact Us: admin [ a t ] ucptt.com