内存泄漏Androi

来源:互联网 发布:string数组倒序 编辑:程序博客网 时间:2024/06/05 08:18

一、单例导致的内存泄漏

Android中单例的生命周期和应用一样长。应用不当可能导致内存泄漏

比如当单例总需要传入Context的时候 如果传入的是Activity或者Service等将导致Activity不能被及时的回收

 二、静态变量导致的内存 泄漏

与单例一样  因为静态变量存储在方法区方法周期伴随着整个应用的生命周期

所以在当需要传入Context等时,需要特别的注意

public class MainActivity extends AppCompatActivity {    private static Info sInfo;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (sInfo != null) {            sInfo = new Info(this);        }    }}class Info {    public Info(Activity activity) {    }}


三、非静内部类变量导致的内存泄漏

因为非静态内部类(包括匿名内部类)默认都会持有外部类的引用,这样当内部类的生命周期很长的时候,会导致外部类会不及时

比如Handle  在Activity的时候可能会导致内存泄漏,这样最好采用的是staitc Handler以及软引用



四、未取消注册或者回调导致的内存泄漏


比如Activity当中注册广播 没有在onDestory中取消  那么这个广播会一直存在系统当中。导致内存泄漏

同样的网络请求取消


五、Time TimeTask导致的内存泄漏

有时候用Time+TimeTask做默写定时任务的时候(如有些人会这个做倒数等等  )当没有取消的时候  会一直在等待TimeTask就会导致内存泄漏啦

所以用Handler.postDelay  然后接到后继续发

六、集合中对象为清理

ArrayList和HashMap等会持有对象的应用,当不用是要remove掉  

七、资源未关闭导致的内存泄漏


如书入库的Cursor等


八、WebView造成的内存泄漏

关于WebView的内存泄露,因为WebView在加载网页后会长期占用内存而不能被释放,因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存。

Webview下面的Callback持有Activity引用,造成Webview内存无法释放,即使是调用了Webview.destory()等方法都无法解决问题(Android5.1之后)。

最终的解决方案是:在销毁WebView之前需要先将WebView从父容器中移除,然后在销毁WebView。详细分析过程请参考这篇文章:WebView内存泄漏解决方法。

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




九、属性动画导致的内存泄漏


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

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





原创粉丝点击