Webview内存泄漏与内存占用过大OOM的优化
2017-02-16 18:08
405 查看
1.首先不能直接在xml写webview组件,用FrameLayout做容器,java中动态添加:
3.销毁时要先销毁外部的容器:
4.再不行:
5.或者:通过反射清楚webview的内存占用
在Activity中回调:
<FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/video_desc_margin_top"></FrameLayout>2.
FrameLayout ll = (FrameLayout) findViewById(R.id.content); // wvContent = new WebView(getApplicationContext()); wvContent = new WebView(weakReference.get()); ll.addView(wvContent);
3.销毁时要先销毁外部的容器:
@Override protected void onDestroy() { // Destroy the AdView. if (wvContent != null) { wvContent.removeAllViews(); ll.removeView(wvContent); wvContent.destroy(); } super.onDestroy(); }
4.再不行:
package com.mycompany.view; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.AttributeSet; import android.webkit.WebView; import android.webkit.WebViewClient; public class NonLeakingWebView extends WebView { private static Field sConfigCallback; static { try { sConfigCallback = Class.forName("android.webkit.BrowserFrame").getDeclaredField("sConfigCallback"); sConfigCallback.setAccessible(true); } catch (Exception e) { // ignored } } public NonLeakingWebView(Context context) { super(context.getApplicationContext()); setWebViewClient( new MyWebViewClient((Activity)context) ); } public NonLeakingWebView(Context context, AttributeSet attrs) { super(context.getApplicationContext(), attrs); setWebViewClient(new MyWebViewClient((Activity)context)); } public NonLeakingWebView(Context context, AttributeSet attrs, int defStyle) { super(context.getApplicationContext(), attrs, defStyle); setWebViewClient(new MyWebViewClient((Activity)context)); } @Override public void destroy() { super.destroy(); try { if( sConfigCallback!=null ) sConfigCallback.set(null, null); } catch (Exception e) { throw new RuntimeException(e); } } protected static class MyWebViewClient extends WebViewClient { protected WeakReference<Activity> activityRef; public MyWebViewClient( Activity activity ) { this.activityRef = new WeakReference<Activity>(activity); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { try { final Activity activity = activityRef.get(); if( activity!=null ) activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); }catch( RuntimeException ignored ) { // ignore any url parsing exceptions } return true; } } }
5.或者:通过反射清楚webview的内存占用
public void setConfigCallback(WindowManager windowManager) { try { Field field = WebView.class.getDeclaredField("mWebViewCore"); field = field.getType().getDeclaredField("mBrowserFrame"); field = field.getType().getDeclaredField("sConfigCallback"); field.setAccessible(true); Object configCallback = field.get(null); if (null == configCallback) { return; } field = field.getType().getDeclaredField("mWindowManager"); field.setAccessible(true); field.set(configCallback, windowManager); } catch(Exception e) { } }
在Activity中回调:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConfigCallback((WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE)); } public void onDestroy() { setConfigCallback(null); super.onDestroy(); }
相关文章推荐
- 一步步优化JVM<四>:决定Java堆的大小以及内存占用
- 记一次Mysql占用内存过高的优化过程
- 【Unity3D游戏开发】性能优化之Texture图片空间和内存占用分析(三七)
- php-fpm 内存占用过大
- Android资源图片内存占用及优化
- 【Unity3D】中如何分配内存占用(解决内存占用过大问题)
- Android资源图片内存占用及优化
- 原GIraph的n平方分区带来的多线程占用内存过大问题:
- javafx——内存占用过大问题
- 优化SQL Server的内存占用之执行缓存
- 优化SQL Server的内存占用之执行缓存
- java优化占用内存的方法(一)
- MSSQL占用内存过大的解决方法
- 如何优化app的运行内存占用
- web应用常用session处理(防session过大,内存占用过大)
- 优化SQL Server的内存占用之执行缓存篇
- 优化SQL Server的内存占用之执行缓存
- 解决Firefox占用内存“过大”的问题(FireFox about:config介绍)
- 解决.net的堆碎片化带来的内存占用过大的问题