【Android】WeakReference弱引用使用

Android 中弱引用常常用于替代 Context 等强引用,是内存优化的一种方式,防止内存泄漏。

比如 Handler 中如果引用 context,AndroidStudio 会自动提醒开发者改为弱引用。

(这里我习惯性用弱引用替代强引用做内存优化,暂不讨论软引用Softreference)

弱引用的好处显而易见,开发者无需担心内存被占用没有及时释放导致的内存泄漏问题,但也会引发弱引用对象空指针问题 ​​NullPointerException​​。

因为​​Java的内存自动回收机制​​​,​​当内存告警或弱引用长时间不用的话​​​,​​频繁的GC就有可能将弱引用回收了​​​,​​下次调用就会报空指针问题​​。

当Android需要申请一大块内存的时候,这个弱引用可能就完蛋了,比如Activity的跳转,直播模块;再比如你写的代码导致了强引用崩溃释放了,service引用的context崩了。

解决这一问题,首先要管理好自己的代码,计算好内存,当需要申请大量内存的时候,要小心一些,再就是让Context不要崩。

其次就是做好判空处理,如果空了可以用​​单例思想​​重新new一下。(跟强引用还是有区别的)

最后,​​不要为了内存优化而优化​​,有些时候不需要。如寄生于Context的模块或者组件,context没了自己也就释放了,完全没必要。

public ResultCode initLegacyContext(MediaFoundationLiveStreamLegacy context){
Log.e("initLegacyContext context:"+context);
mLegacyContext = new WeakReference<MediaFoundationLiveStreamLegacy> (context);
if(context == null){
Log.e("cant get MediaFoundationPlayerLegacy Context");
return ResultCode.ParameterInvalid;
}
return ResultCode.OK;
}