这里转载了一款文章,点击观看。详细的介绍了日常开发中经常使用的一些单例,线程,Handler一类的OOM的防止和处理。
1.单例产生的内存溢出
2.handler产生的内存溢出
3.线程造成的内存溢出。AsyncTask
4.非静态内部类创建静态实例内存溢出。对外部的一个引用。
5.webview
6.资源未关闭。
webview的解决方案:
其中一种就是使用getApplicationgContext作为参数构建WebView,然后动态添加到一个ViewGroup中,最后退出的时候调用webView的销毁的函数,虽然也达到了防止内存溢出的效果,但是在有些网页弹出时候需要记住密码的对话框的时候,会出现Unable to add window -- token null is not for an application 的错误,所以这里采用的解决办法是通过把使用了WebView的Activity(或者Service)放在单独的进程里。然后在检测到应用占用内存过大有可能被系统干掉或者它所在的Activity(或者Service)结束后,调用android.os.Process.killProcess(android.os.Process.myPid());,主动Kill掉进程。由于系统的内存分配是以进程为准的,进程关闭后,系统会自动回收所有内存。
public class MainActivity5 extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
mWebView = (WebView) findViewById(R.id.web);
mWebView.loadUrl(
"http://www.cnblogs.com/whoislcj/p/5720202.html");
}
@Override
protected void onDestroy() {
destroyWebView();
android.os.Process.killProcess(android.os.Process.myPid());
super .onDestroy();
}
private void destroyWebView() {
if (mWebView != null ) {
mWebView.pauseTimers();
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null ;
}
}
}