Webview内存泄漏与内存占用过大OOM的优化
发布日期:2022-02-25 00:55:13 浏览次数:49 分类:技术文章

本文共 3553 字,大约阅读时间需要 11 分钟。

1.首先不能直接在xmlwebview组件FrameLayout做容器,java中动态添加:

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
activityRef; public MyWebViewClient( Activity activity ) { this.activityRef = new WeakReference
(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();}

转载地址:https://blog.csdn.net/qq_30167925/article/details/55264359 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Okhttp 3.0上传数据与PUT请求
下一篇:Webview内嵌在ScrollView中的底部空白和滑动冲突

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月23日 23时04分37秒