在这个开发过程中,我们需要使用webview来显示一些界面,但是如果加载的页面中图片很多,你会发现内存占用会暴涨,退出后接口,即使包含在webview的Activity的destroy()方法中,使用webview.destroy();webview=null;仍然对内存占用没有影响。有人说,一旦你的xml布局中引用了webview甚至不用,重新进入Application后会阻碍内存的gc。包括有时会导致OOM的MapView的使用。几经周折,在网上看到了各种解决方案,在此分享给大家。但是至今没有找到根本的解决办法,网上也有报道说是sdk的bug。但是不管怎样,我们还是要用到它。要在不造成内存泄漏的情况下使用WebView,首先应该做的不是在xml中定义webview节点,而是在需要的时候动态生成。即:可以在使用WebView的地方放一个类似ViewGroup的LinearLayout节点,然后在要使用WebView的时候动态生成:WebViewmWebView=newWebView(getApplicationgContext());LinearLayoutmll=findViewById(R.id.xxx);等。添加视图(mWebView);然后一定要在onDestroy()方法中显式调用protectedvoidonDestroy(){super.onDestroy();mWebView.removeAllViews();mWebView.destroy()}注意:newWebView(getApplicationgContext());必须传入ApplicationContext,如果传入Activity的Context,会一直保持对内存的引用。有人用这种方法解决了Activity被淘汰时保持引用的问题。但是你会发现,如果你需要在WebView中打开一个链接或者你打开的页面有flash,如果你想从你的WebView中弹出一个dialog,会导致从ApplicationContext到ActivityContext的转换错误,这会导致你的应用坠毁。这是因为在加载flash的时候,系统会先把你的WebView作为父控件,然后在控件上绘制flash。他想找一个ActivityContext给他画,可是你传入的是ApplicationContext。结果,你可以知道。所以大牛们针对Activity销毁后还保留引用的问题提供了另一种解决方案:既然你不能帮我删除引用,那我自己来。于是诞生了下面这个方法:(作者说这个方法是依赖android.webkit实现的,在最近的版本中可能会失效)field.getType().getDeclaredField("mBrowserFrame");field=field.getType().getDeclaredField("sConfigCallback");field.setAccessible(true);ObjectconfigCallback=field.get(null);if(null==configCallback){return;}field=field.getType().getDeclaredField("mWindowManager");field.setAccessible(true);field.set(configCallback,windowManager);}catch(Exceptione){}}然后在活动方法:publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setConfigCallback((WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE));}publicvoidonDestroy(){setConfigCallback(null);super.onDestroy();}反射法在我的实验(2.3.6)中确实有用。当申请内存占用70M左右的时候,明显会释放到50M或者60M,然后释放会慢一点,其实是看不见的。没用这个方法之前可能已经到120M了。但!!!我们的应用程序需要较低的内存使用量,为什么会肿胀?冷吗?不会的,经过各种纠结,终于找到了完美的解决办法!!!这种方式很适合我们的需求,退出WebView界面后内存回收很快。如果要问这个方法是什么,不要用9999或者8999,只要仔细看下面这句话:那就是为加载WebView的界面启动一个新的进程,页面结束后关闭这个进程出口。说了这么多,你明白了吗?但是在这一次中,我在杀死自己的进程时遇到了问题。网上介绍的各种方法都不好用,killBackgroundProcesses(getPackageName());各种不好用,***useSystem.exit(0);直接退出虚拟机(Android为每个进程创建一个虚拟机)。这个完全不用担心,一旦退出,内存就会被释放。听涛哥说QQ也是这么干的。***大侠要问出处,附上大牛解释引起问题的出处。此泄漏出现在external/webkit/Source/WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp中。我真的没有深入研究过。如果你有兴趣,你可以看看。---a/Source/WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp+++b/Source/WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp@@-63,10+63,10@@public:JNIEnv*env=JSC::Bindings::getJNIEnv();//Initializeourreadbuffertothecapacityofout.if(!m_buffer){-m_buffer=env->NewByteArray(out->capacity());-m_buffer=(jbyteArray)env->NewGlobalRef(m_buffer);+ScopedLocalRef
