0
点赞
收藏
分享

微信扫一扫

Android 内存优化(六) —— 集合对象,资源未关闭等造成内存泄漏

中间件小哥 2022-04-14 阅读 123
android

集合中的对象未清理造成内存泄露
这个比较好理解,如果一个对象放入到 ArrayList 、 HashMap 等集合中,这个集合就会持有该对象的引用。当我们不再需要这个对象时,也并没有将它从集合中移除,这样只要集合还在使用(而
此对象已经无用了),这个对象就造成了内存泄露。并且如果集合被静态引用的话,集合里面那
些没有用的对象更会造成内存泄露了。所以在使用集合时要及时将不用的对象从集合 remove ,或
者 clear 集合,以避免内存泄漏。


资源未关闭或释放导致内存泄露
在使用 IO 、 File 流或者 Sqlite 、 Cursor 等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就及时关闭,以便缓冲能及时得到释放,从而避免内存泄露。

属性动画造成内存泄露
动画同样是一个耗时任务,比如在 Activity 中启动了属性动画( ObjectAnimator ),但是在销毁
的时候,没有调用 cancle 方法,虽然我们看不到动画了,但是这个动画依然会不断地播放下去,
动画引用所在的控件,所在的控件引用 Activity ,这就造成 Activity 无法正常释放。因此同样要
在 Activity 销毁的时候 cancel 掉属性动画,避免发生内存泄漏。

@Overrideprotected void onDestroy() {
    super.onDestroy();
    mAnimator.cancel();
}

WebView 造成内存泄露 造成内存泄露
关于 WebView 的内存泄露,因为 WebView 在加载网页后会长期占用内存而不能被释放,因此我
们在 Activity 销毁后要调用它的 destory() 方法来销毁它以释放内存。
另外在查阅 WebView 内存泄露相关资料时看到这种情况:
Webview 下面的 Callback 持有 Activity 引用,造成 Webview 内存无法释放,即使是调用了
Webview.destory() 等方法都无法解决问题(Android5.1 之后)。
最终的解决方案是:在销毁 WebView 之前需要先将 WebView 从 父容器中移除,然后在销毁 WebView 。
详细分析过程请参考这篇文章:
[](http://blog.csdn.net/xygy8860/article/details/53334476?utm_source=itdadao&utm_medium
=referral)(http://blog.csdn.net/xygy8860/article/details/53334476)[WebView 内存泄漏解决方
法]。

@Overrideprotected void onDestroy() {
    super.onDestroy();
    // 先从父控件中移除 WebView
    mWebViewContainer.removeView(mWebView);
    mWebView.stopLoading();
    mWebView.getSettings().setJavaScriptEnabled(false);
    mWebView.clearHistory();
    mWebView.removeAllViews();
    mWebView.destroy();
}

总结
内存泄露在 Android 内存优化是一个比较重要的一个方面,很多时候程序中发生了内存泄露我们
不一定就能注意到,所有在编码的过程要养成良好的习惯。总结下来只要做到以下这几点就能避
免大多数情况的内存泄漏:
构造单例的时候尽量别用 Activity 的引用;
静态引用时注意应用对象的置空或者少用静态引用;
使用静态内部类+软引用代替非静态内部类;
及时取消广播或者观察者注册;
耗时任务、属性动画在 Activity 销毁时记得 cancel ;
文件流、 Cursor 等资源及时关闭;
Activity 销毁时 WebView 的移除和销毁。

举报

相关推荐

0 条评论