• 每日日报2021.3.10


    今天完成内容:

    1.学习android

    三、webview遇到的那些坑与解决方法

    1. WebView的内存泄露。
    这个问题,很难清晰描述,你在谷歌里搜 webview lead memory 能搜到很多结果 甚至还有给谷歌提交的issue 哈哈,我也无法给出一个清晰的答案 在什么时候 什么版本那些手机上一定会出现内存泄露,
    但是根据一些monkey结果来看,有时,webview内存泄露的情况还是很严重的,尤其是当你加载的页面比较庞大的时候。解决方案参考下微信和qq的做法,试了一下是目前效果最好的,
    就是 当你要用webview的时候,记得最好 另外单独开一个进程 去使用webview 并且当这个 进程结束时,请手动调用System.exit(0)。
    这是目前对于webview 内存泄露 最好的解决方案。使用此方法 所有因为webview引发的 资源无法释放等问题 全部可以解决。

    2. getSettings().setBuiltInZoomControls(true) 引发的crush。
    这个方法调用以后 如果你触摸屏幕 弹出那个提示框还没消失的时候 你如果activity结束了 就会报错了。3.0以上 4.4以下很多手机会出现这种情况
    所以为了规避他,我们通常是在activity的onDestroy方法里手动的将webiew设置成 setVisibility(View.GONE)

    3.onPageFinished 函数到底有用没有?
    多数开发者都是参考的http://stackoverflow.com/questions/3149216/how-to-listen-for-a-webview-finishing-loading-a-url-in-android 这个上面的高票答案。
    但其实根据我自己观察,这个函数并没有什么卵用,有的时候是提前结束,有的时候就迟迟无法结束,你信这个函数 还不如信上帝,甚至于onProgressChanged这个函数
    都比onPageFinished 要准一些。如果你的产品经理坚持你一定要实现这种功能的话,我建议你 提早结束他,否则卡在那用户迟迟动不了 这种体验不好。
    有空的同学可以跟一下源码,onPageFinished 在不同的内核里 调用的时机都不一样。说实话 我也很醉。。。这个问题 有完美解决方案的 请知会我一下。。。

    4.后台无法释放js 导致耗电。
    这个可能很少有人知道,你如果webview加载的html里 有一些js 一直在执行比如动画之类的东西,如果此刻webview 挂在了后台
    这些资源是不会被释放,用户也无法感知,导致一直占有cpu 耗电特别快,所以大家记住了,如果遇到这种情况 请在onstop和onresume里分别把setJavaScriptEnabled();
    给设置成false和true。

    5.如果实在不想用开额外进程的方式解决webview 内存泄露的问题,那么下面的方法很大程度上可以避免这种情况

    public void releaseAllWebViewCallback() { 
     if (android.os.Build.VERSION.SDK_INT < 16) { 
     try { 
     Field field = WebView.class.getDeclaredField("mWebViewCore"); 
    field = field.getType().getDeclaredField("mBrowserFrame"); 
     field = field.getType().getDeclaredField("sConfigCallback");
    field.setAccessible(true); 
     field.set(null, null);
     } catch (NoSuchFieldException e) {
     if (BuildConfig.DEBUG) {
      e.printStackTrace();
      }
     } catch (IllegalAccessException e) {
     if (BuildConfig.DEBUG) {
      e.printStackTrace();
      }
      }
     } else {
     try {
     Field sConfigCallback = Class.forName("android.webkit.BrowserFrame").getDeclaredField("sConfigCallback");
     if (sConfigCallback != null) {
     sConfigCallback.setAccessible(true);
     sConfigCallback.set(null, null);
      }
     } catch (NoSuchFieldException e) {
    if (BuildConfig.DEBUG) {
      e.printStackTrace();
      }
     } catch (ClassNotFoundException e) {
     if (BuildConfig.DEBUG) {
      e.printStackTrace();
      }
     } catch (IllegalAccessException e) {
     if (BuildConfig.DEBUG) {
      e.printStackTrace();
      }
      }
      }
     }
    

    在webview的 destroy方法里 调用这个方法就行了。


    摘抄源于:
    作者:世锋日上
    链接:https://www.jianshu.com/p/d2f5ae6b4927
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    3.看视频

    遇到问题:

    理解不够透彻

    明日目标:

    学习Android studio的开发

  • 相关阅读:
    jdk和jre是什么?都有什么用?(转帖)
    滚动栏范围位置函数(SetScrollRange、SetScrollPos、GetScrollRange、GetScrollPos)
    C#异步调用
    编译hadoop2.2.0源码时报错
    项目中登陆页面的显示
    VB读写Excel
    C socket demo
    java设计模式----单例模式
    poj3358数论(欧拉定理)
    Java实现 蓝桥杯VIP 算法训练 排列问题
  • 原文地址:https://www.cnblogs.com/leiyu1905/p/14906660.html
Copyright © 2020-2023  润新知