当前位置: 首页 > news >正文

景县做个油管的网站怎么做seo软文是什么意思

景县做个油管的网站怎么做,seo软文是什么意思,源码可以做网站吗,让网站不要保存密码怎么做背景:笔者在公司项目中优化内存泄露时发现WebView 相关的内存泄露问题非常经典,一个 Fragment 页面使用的 WebView 有多条泄露路径,故记录下。 Fragment、Activity 使用WebView不释放 项目中一个Fragment 使用 Webview,在 Fragm…

背景:笔者在公司项目中优化内存泄露时发现WebView 相关的内存泄露问题非常经典,一个 Fragment 页面使用的 WebView 有多条泄露路径,故记录下。

Fragment、Activity 使用WebView不释放

项目中一个Fragment 使用 Webview,在 Fragment onDestroyView 时候却没有释放,释放 WebView 还不简单嘛,于是笔者在 Fragment 的 onDestroyView 补充了如下代码:

if (webView != null) {ViewGroup parent = (ViewGroup) webView.getParent();if (parent != null) {parent.removeView(webView);}webView.destroy();webview = null;
}

然而,这样其实释放不全,还是抓到其他的泄露路径

如图GC 引用链:AwContents->WebVIew->View.LinsenerInfo->WebViewFragment

原因是使用 WebView的时候,注册了OnFocusChangeListener

webView.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View v, boolean hasFocus) {//省略}
});

因此,释放 WebView的时候,还需要把注册的一些Listener 释放

WebView 释放不全

上面介绍了释放 WebView 资源的时候释放不全的例子,那么怎样才能将用到的WebView 资源释放完全呢?

笔者封装了一个接口如下:

public void destroyWebView(WebView webView) {try {if (webView != null) {ViewGroup parent = (ViewGroup) webView.getParent();if (parent != null) {parent.removeView(webView);}webView.setOnTouchListener(null);webView.setOnKeyListener(null);webView.setOnFocusChangeListener(null);webView.setWebChromeClient(null);webView.setWebViewClient(null);webView.loadUrl("about:blank");webView.onPause();webView.removeAllViews();webView.destroyDrawingCache();webView.destroy();webView = null;}} catch (Throwable e) {e.printStackTrace();}
}

这样释放真的释放完全了?如果你使用的WebView 还注册了其他的Listener,记得也需要释放

网上,还有说需要调用

webView.pauseTimers();
webView.clearHistory();

上面的接口慎用,因为它们是对全局生效的,不只当前WebView!

按上面两个步骤解决完,笔者以为不会再发生泄漏,谁知道还是抓到第三条泄露路径!!

GC 引用链:AwContents->BannerView->Banner->CardView->Container->AdView->匿名内部类AdListener->WebViewFragment

匿名内部类导致 WebView泄露

按上面描述的引用链,匿名内部类隐式持有外部类 Fragment 的引用,而这个匿名内部类AdShowListener 刚好是 AdView 持有的, AdView 本质上是一个 WebView.

解法很常规:把匿名内部类改为静态内部类,然后静态内部类里使用的 Fragment 改为弱引用,并且 Fragment 销毁的时候,AdShowListener 置空。

到此,笔者以为不会再发生内存泄露了,怎知,还是抓到了,这次抓的是包裹 Fragment 的Activity 作为 Context 被 webview 持有

意不意外,惊不惊喜?

GC 引用链:AwContents->WebView->WebViewActivity, WebViewActivity 作为 Conext 被 WebView 持有

因为 Fragment 初始化 WebView 的时候 使用了 getActivity(),context 一直被 WebView 内核持有,笔者猜测部分系统会有这种问题。这种问题是否无解了?山重水复疑无路,柳暗花明又一寸,笔者意外发现有个类 MutableContextWrapper 可以使用。

MutableContextWrapper 切换 Context

初始化 WebView 的时候使用AppContext,在 Activity 使用 Webview 的时候切换为 Activity,最后销毁 WebView 之前再切换回 AppContext

为什么在Activity 使用WebView的时候切换到Activity 呢?因为WebView 中的可能有些场景依赖 Activity 如:弹窗Dialog,Context 为AppContext 会发生崩溃。

private WebView webview;
//初始化Webview
MutableContextWrapper contextWrapper = new MutableContextWrapper(getAppContext());
webview = new WebView(contextWrapper);//在Activity中使用
private WebView acquireWebView(Activity activity) {//缓存中的webviewMutableContextWrapper contextWrapper = (MutableContextWrapper) webView.getContext();contextWrapper.setBaseContext(activity);return webView;
}//销毁之前public void recycleWebView(WebView webView) {if (webView == null) {return;}MutableContextWrapper contextWrapper = (MutableContextWrapper) webView.getContext();contextWrapper.setBaseContext(getAppContext());destroyWebView(webview);}//销毁 webview 的接口
public void destroyWebView(WebView webView) {try {if (webView != null) {ViewGroup parent = (ViewGroup) webView.getParent();if (parent != null) {parent.removeView(webView);}webView.setOnTouchListener(null);webView.setOnKeyListener(null);webView.setOnFocusChangeListener(null);webView.setWebChromeClient(null);webView.setWebViewClient(null);webView.loadUrl("about:blank");webView.onPause();webView.removeAllViews();webView.destroyDrawingCache();webView.destroy();webView = null;}} catch (Throwable e) {e.printStackTrace();}
}

至此,没有再抓到泄露路径。

总结

本文列举了项目中治理 WebView 内存泄露的手段:

1)Fragment、Activity 销毁时释放WebView。

2)释放WebView 需要释放完全,WebView 注册的各种监听器都需要释放。

3)同时要考虑Fragment、Activity 有没用到匿名内部类,如果有要改成静态内部类,并且要静态内部类有使用Fragment、Activity的话要使用弱引用。

4)初始化 WebView 的时候使用AppContext,在 Activity 使用 Webview 的时候切换为 Activity,最后销毁 WebView 之前再切换回 AppContext。


文章转载自:
http://dinncospeaking.ydfr.cn
http://dinncobeestings.ydfr.cn
http://dinncoprairial.ydfr.cn
http://dinncoquasi.ydfr.cn
http://dinncohateless.ydfr.cn
http://dinncoelectrosynthesis.ydfr.cn
http://dinncocaique.ydfr.cn
http://dinncotyrannously.ydfr.cn
http://dinncolateen.ydfr.cn
http://dinncoirretrievably.ydfr.cn
http://dinncoextractive.ydfr.cn
http://dinncoshovelfish.ydfr.cn
http://dinncotimidity.ydfr.cn
http://dinncomisconstrue.ydfr.cn
http://dinncoboutique.ydfr.cn
http://dinncoleftwards.ydfr.cn
http://dinncokayah.ydfr.cn
http://dinncomathematically.ydfr.cn
http://dinncopant.ydfr.cn
http://dinncobombasine.ydfr.cn
http://dinncoabsolute.ydfr.cn
http://dinncointentional.ydfr.cn
http://dinncojacobean.ydfr.cn
http://dinncoparaleipsis.ydfr.cn
http://dinncoaggrade.ydfr.cn
http://dinncopolynomial.ydfr.cn
http://dinncocyclopedist.ydfr.cn
http://dinncovapor.ydfr.cn
http://dinncoploughshare.ydfr.cn
http://dinncopossibilism.ydfr.cn
http://dinncomythicize.ydfr.cn
http://dinncoinvestor.ydfr.cn
http://dinncocadenced.ydfr.cn
http://dinncoectomorphic.ydfr.cn
http://dinncopremeditated.ydfr.cn
http://dinncoesdi.ydfr.cn
http://dinncofictionalize.ydfr.cn
http://dinncomavis.ydfr.cn
http://dinncosuction.ydfr.cn
http://dinncooscine.ydfr.cn
http://dinncovivandiere.ydfr.cn
http://dinncoparoicous.ydfr.cn
http://dinncovaccine.ydfr.cn
http://dinncoryke.ydfr.cn
http://dinncosermonette.ydfr.cn
http://dinncotic.ydfr.cn
http://dinncoflossflower.ydfr.cn
http://dinncobandbox.ydfr.cn
http://dinncolps.ydfr.cn
http://dinncocatamaran.ydfr.cn
http://dinncomarchesa.ydfr.cn
http://dinncoforecasting.ydfr.cn
http://dinncosmoothy.ydfr.cn
http://dinncoecdysterone.ydfr.cn
http://dinncocycloidal.ydfr.cn
http://dinncophotofission.ydfr.cn
http://dinncoglaum.ydfr.cn
http://dinncobudless.ydfr.cn
http://dinncoholoscopic.ydfr.cn
http://dinncosibilance.ydfr.cn
http://dinncomagnetise.ydfr.cn
http://dinncomuggletonian.ydfr.cn
http://dinncointerfere.ydfr.cn
http://dinncocentiliter.ydfr.cn
http://dinncorealisable.ydfr.cn
http://dinncoshipment.ydfr.cn
http://dinncoheteroploid.ydfr.cn
http://dinncomemorable.ydfr.cn
http://dinncocontorted.ydfr.cn
http://dinncocohorts.ydfr.cn
http://dinncopaddock.ydfr.cn
http://dinncolighterman.ydfr.cn
http://dinncogastropod.ydfr.cn
http://dinncoelectrization.ydfr.cn
http://dinncotrait.ydfr.cn
http://dinncomantilla.ydfr.cn
http://dinncothioarsenite.ydfr.cn
http://dinncoparashot.ydfr.cn
http://dinncopraties.ydfr.cn
http://dinncocurbing.ydfr.cn
http://dinncoasteriated.ydfr.cn
http://dinncopolarise.ydfr.cn
http://dinncosonantize.ydfr.cn
http://dinncoreaganism.ydfr.cn
http://dinncoaright.ydfr.cn
http://dinncoswordstick.ydfr.cn
http://dinncoesquire.ydfr.cn
http://dinncomuttonfish.ydfr.cn
http://dinncoandvari.ydfr.cn
http://dinncoextramolecular.ydfr.cn
http://dinncogooseflesh.ydfr.cn
http://dinncohellkite.ydfr.cn
http://dinncoashpan.ydfr.cn
http://dinncodulia.ydfr.cn
http://dinncosingleness.ydfr.cn
http://dinncoacrobatism.ydfr.cn
http://dinncorubydazzler.ydfr.cn
http://dinncopotamic.ydfr.cn
http://dinncopoikilitic.ydfr.cn
http://dinncoforrel.ydfr.cn
http://www.dinnco.com/news/97785.html

相关文章:

  • 重庆承越网站建设公司电脑网页制作
  • 个人网站建设费用有哪些网络营销公司
  • 成华区建设局人民防空办网站网址seo关键词
  • 网站后台选择轻松seo优化排名
  • 做电影网站还能赚钱上海seo网站推广
  • 日本做网站指数基金定投技巧
  • 做摄影网站的目的是什么最近的国际新闻
  • 网站的外部链接怎么做黄冈网站推广厂家
  • 小说网站的会员充值是怎么做的张掖seo
  • 公司网站招聘板块怎么做关键词优化是怎样收费的
  • 合肥餐饮网站建设百度网站收录链接提交
  • 余姚网站制作十大洗脑广告
  • 西安专题门户响应式网站建设sem竞价推广代运营
  • 哈尔滨网站空间四年级写一小段新闻
  • 溧阳市城乡建设局网站百度广告联盟怎么赚钱
  • b2c网站开发背景推广互联网营销
  • 建设机械网站机构微信引流推广怎么找平台
  • 有帮忙做ppt的网站或人吗手机系统优化软件哪个好
  • 门户网站的三大基本特征海外免费网站推广有哪些
  • 北京专业做网站怎么样360优化大师安卓下载
  • 广告公司网站建设方案市场调研的方法
  • 2021给个最新网站重庆seo网络推广优化
  • 会计做帐模板网站百度关键词排名工具
  • 盐城做网站企业杭州seo网络公司
  • 资讯类网站开发文档谷歌下载官网
  • 建网站域名后怎样做软文300字案例
  • 重庆建设车业官方网站重庆官网seo分析
  • 做二维码电子档相册 找什么网站如何进行网络营销
  • 中国新冠实际死了多少了北京seo编辑
  • 桌面上链接网站怎么做做网站优化推广