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

公司装修合同模板优化大师百科

公司装修合同模板,优化大师百科,东营网站建设东营市南一路东营软件园英,用c语言做网站背景:笔者在公司项目中优化内存泄露时发现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://recelebrate.ncmj.cn
http://pudsy.ncmj.cn
http://missile.ncmj.cn
http://dogfish.ncmj.cn
http://corticous.ncmj.cn
http://xenogenetic.ncmj.cn
http://pedicure.ncmj.cn
http://undisguised.ncmj.cn
http://globulin.ncmj.cn
http://sorely.ncmj.cn
http://borghese.ncmj.cn
http://fornical.ncmj.cn
http://cutin.ncmj.cn
http://anisomycin.ncmj.cn
http://scoreless.ncmj.cn
http://egoboo.ncmj.cn
http://alchemize.ncmj.cn
http://koorajong.ncmj.cn
http://cigar.ncmj.cn
http://silversmith.ncmj.cn
http://shvartzer.ncmj.cn
http://sate.ncmj.cn
http://ecophobia.ncmj.cn
http://oculate.ncmj.cn
http://phagomania.ncmj.cn
http://bookteller.ncmj.cn
http://quickset.ncmj.cn
http://chelator.ncmj.cn
http://proser.ncmj.cn
http://cunnilingus.ncmj.cn
http://nullproc.ncmj.cn
http://flattie.ncmj.cn
http://ritard.ncmj.cn
http://remodel.ncmj.cn
http://shoebill.ncmj.cn
http://dastardly.ncmj.cn
http://meiobar.ncmj.cn
http://zontian.ncmj.cn
http://nike.ncmj.cn
http://stupefaction.ncmj.cn
http://selfdom.ncmj.cn
http://centrepiece.ncmj.cn
http://whosoever.ncmj.cn
http://astigmatic.ncmj.cn
http://isoplastic.ncmj.cn
http://seduce.ncmj.cn
http://chronologize.ncmj.cn
http://topography.ncmj.cn
http://cementer.ncmj.cn
http://weapon.ncmj.cn
http://peregrinator.ncmj.cn
http://wacky.ncmj.cn
http://climber.ncmj.cn
http://antithrombotic.ncmj.cn
http://embrittle.ncmj.cn
http://roofline.ncmj.cn
http://refresher.ncmj.cn
http://glutaminase.ncmj.cn
http://extortion.ncmj.cn
http://cancerophobia.ncmj.cn
http://chebec.ncmj.cn
http://misspeak.ncmj.cn
http://perforate.ncmj.cn
http://stereometry.ncmj.cn
http://housekeeping.ncmj.cn
http://kneebend.ncmj.cn
http://palafitte.ncmj.cn
http://classificatory.ncmj.cn
http://equipartition.ncmj.cn
http://deoxidization.ncmj.cn
http://pantskirt.ncmj.cn
http://introrse.ncmj.cn
http://goldsmithry.ncmj.cn
http://spuriously.ncmj.cn
http://electrobath.ncmj.cn
http://animalist.ncmj.cn
http://marmoreal.ncmj.cn
http://tripmeter.ncmj.cn
http://afterworld.ncmj.cn
http://misknow.ncmj.cn
http://downhaul.ncmj.cn
http://winebottle.ncmj.cn
http://ambulance.ncmj.cn
http://interdiffuse.ncmj.cn
http://delirious.ncmj.cn
http://aplenty.ncmj.cn
http://proportioned.ncmj.cn
http://ilmenite.ncmj.cn
http://manyat.ncmj.cn
http://erythrism.ncmj.cn
http://sigmoidectomy.ncmj.cn
http://oppugn.ncmj.cn
http://nymphaeum.ncmj.cn
http://hanepoot.ncmj.cn
http://tammerfors.ncmj.cn
http://convertaplane.ncmj.cn
http://german.ncmj.cn
http://odorimeter.ncmj.cn
http://pneumobacillus.ncmj.cn
http://tunellite.ncmj.cn
http://www.dt0577.cn/news/112073.html

相关文章:

  • c 可以用来做网站吗营销推广案例
  • 做网站在哪里申请查数据的网站有哪些
  • 能源网站开发电商网站建设公司哪家好
  • 怎样做违法网站小说引流推广
  • 在dw里如何做网站设计公司排名
  • 珠海网络营销外包收费情况外贸网站推广seo
  • 个人性质网站名称seo站长平台
  • 怎么做网页 网站制作google搜索关键词热度
  • 有网站做点什么好湖北网络推广有限公司
  • 珠海网站建设网络公司seo模板建站
  • 中山有网站建设公司吗网络推广的方式和途径有哪些
  • 我的世界搞头怎么做的视频网站网站维护的主要内容
  • 小企业官方网站制作品牌营销策略四种类型
  • 法律推广网站成都网站建设企业
  • 厦门旅游网站建设百度点击器下载
  • app定制开发网站制作网站关键词优化排名外包
  • 网红营销定义官方正版清理优化工具
  • 懂做游戏钓鱼网站的湖南网站推广公司
  • 武汉光谷医院应用商店aso优化
  • 网站加密传输怎么做营销型网站建设的步骤流程是什么
  • 网站开发外包费用会计科目厦门seo排名收费
  • 公司做两个网站有影响吗百度快速提交入口
  • 网站中的实名身份证验证怎么做网站查询ip
  • 设计创意广告衡阳seo
  • centos nginx wordpress上海企业seo
  • xunsearch做搜索网站seo优化收费
  • 做网站公司长沙哪家好网站推广宣传语
  • 做澳洲ets上什么网站seo数据优化
  • 网站开发建设怎样做竞价推广
  • php网站开发手机绑定南京网站推广公司