0. Notice - earlier version

  • 要使用WebView不造成内存泄漏,首先应该做的就是不能在xml中定义webview节点,而是在需要的时候动态生成。即:可以在使用WebView的地方放置一个LinearLayout类似ViewGroup的节点,然后在要使用WebView的时候,动态生成即:
  1. WebView mWebView = new WebView(getApplicationgContext());
  2. LinearLayout mll = findViewById(R.id.xxx);
  3. mll.addView(mWebView);

然后一定要在onDestroy()方法中显式的调用:

  1. protected void onDestroy() {
  2. super.onDestroy();
  3. mWebView.removeAllViews();
  4. mWebView.destroy()
  5. }

注意: new WebView(getApplicationgContext()) ;必须传入ApplicationContext如果传入Activity的Context的话,对内存的引用会一直被保持着。有人用这个方法解决了当Activity被消除后依然保持引用的问题。但是你会发现,如果你需要在WebView中打开链接或者你打开的页面带有flash,获得你的WebView想弹出一个dialog,都会导致从ApplicationContext到ActivityContext的强制类型转换错误,从而导致你应用崩溃。

1. What leads to Memory leak

1.1 InnerClass

  1. public class InnerClassActivity extends Activity{
  2. private static Leak mLeak;
  3. class Leak {
  4. int a = 3;
  5. private Context mLeakContext;
  6. Leak(Context context) {
  7. mLeakContext = context;
  8. }
  9. }
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.test);
  14. mLeak = new Leak(this);
  15. Toast.makeText(this, "This is InnerClassActivity", Toast.LENGTH_SHORT).show();
  16. }
  17. }

1.2 Singleton

  1. public class Singleton {
  2. private static Singleton instance;
  3. private Context mContext1;
  4. private Singleton(Context context) {
  5. this.mContext1 = context;
  6. }
  7. public static Singleton getInstance(Context context) {
  8. if(instance == null) {
  9. synchronized (Singleton.class) {
  10. if (instance == null) {
  11. instance = new Singleton(context);
  12. }
  13. }
  14. }
  15. return instance;
  16. }
  17. }

1.3 webview - earlier version

  1. public class WebViewCreateActivity extends Activity{
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.webview_create);
  6. LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
  7. LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
  8. WebView webView = new WebView(this);
  9. webView.setLayoutParams(layoutParams);
  10. WebSettings webSettings = webView.getSettings();
  11. webSettings.setJavaScriptEnabled(true);
  12. webSettings.setDomStorageEnabled(true);
  13. webView.loadUrl("https://www.baidu.com/");
  14. ll.addView(webView);
  15. Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
  16. }
  17. }

2. How to detect the Memory Leak

2.1 Android Studio

  • GC manually
  • dump Java Heap

2.2 MemoryLeak in Our Project

品牌 固件 泄漏点
三星 4.0.4 LightAppManager
小米 5.0.1 LightAppManager/ mAccessibilityManager
华为 6.0 LightAppManager/ mAccessibilityManager

2.2.1 LightAppManager泄漏

3次手动GC后,内存的增长:

泄漏点1: LightAppManager 泄漏

泄漏点2: WebView-wrapper getSystemService泄漏

3. 官方态度

It's 2016 now and, as far as I can see it, the issue still hasn't been resolved. I tested it on Nexus 5 and Nexus 6 with the latest WebView updates (since the component is now separate from the OS itself). Could someone, please, take a look at this issue?!

来源: https://code.google.com/p/android/issues/detail?id=9375

最新文章

  1. jsp使用EL表达式回传boolean值出错的问题
  2. 第一章 web应用程序开发原理
  3. OKHttp
  4. Uva11374 Airport Express
  5. ibatis中iterate的用法(conjunction="or" ",")
  6. Tornado,表单处理,一样在行
  7. Django中的Model(操作表)
  8. ios NSMethodSignature and NSInvocation 消息转发
  9. C#4.0中var和dynamic的区别
  10. SOFTWARE_INTRODUCE_01
  11. 记一次排查log4net 不输出日志的解决过程
  12. getRequestURI()与getRequestURL()的区别
  13. 线上服务器上安装的VNCServer不能正常工作
  14. ioctl函数
  15. Tars http服务
  16. JavaScript——JS屏蔽F12和右键
  17. BZOJ3531 树剖 + 动态开点线段树
  18. JQuery续
  19. 自学Linux Shell11.3-使用变量
  20. how-to-convert-string-to-localdate

热门文章

  1. [LeetCode] Longest Palindromic Substring 最长回文串
  2. C#中两个Form窗口之间的传值(父->子)(子->父)
  3. 自建Ceph存储与 AWS、阿里云、腾讯云的成本对比
  4. android studio 集成微信登录
  5. JAVA+Maven+TestNG搭建接口测试框架及实例
  6. --关于null在oracle数据库中是否参与计算,进行验证,
  7. 北京培训记day3
  8. Pi 前2600位
  9. java 的public private protected作用域
  10. CentOS 7 防火墙 firewall 的使用