• Android layer type与WebView白屏-第一次加载webview很慢


    在项目中遇到WebView在加载图片的时候会出现白屏的情况,后来在xml设置了WebView属性,问题的到解决:

     @SuppressWarnings("deprecation")  
        @Override  
        protected void onDestroy() {  
         if (mWebView != null){  
             try { 
    //           mWebView.clearView();  
    //           mWebView.loadUrl("about:blank");  
                 mWebView.clearCache(true);  
                 mWebView.destroy();// 窗体销毁,要webview销毁;考虑安全问题和内存溢出  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
         }  
            MyLog.e(TGA, "  窗体销毁");  
            isDestroy=true;  
            System.gc();  
            super.onDestroy();  
        }  
     <WebView   android:id="@+id/webview"  
               android:layout_width="fill_parent"  
                android:layout_height="fill_parent"  
              android:layerType="software"   
              android:scrollbars="none" />  

    在网上也有layer的一些资料:

    以下摘自http://blog.csdn.net/a345017062/article/details/7478667

    先说说这三个layer。

    LAYER_TYPE_SOFTWARE 无论硬件加速是否打开,都会有一张Bitmap(software layer),并在上面对WebView进行软渲染。 好处: 在进行动画,使用software可以只画一次View树,很省。 什么时候不要用: View树经常更新时不要用。尤其是在硬件加速打开时,每次更新消耗的时间更多。因为渲染完这张Bitmap后还需要再把这张Bitmap渲染到hardware layer上面去。

    LAYER_TYPE_HARDWARE 硬件加速关闭时,作用同software。 硬件加速打开时会在FBO(Framebuffer Object)上面做渲染,在进行动画时,View树也只需要画一次。

    两者区别: 1、一个是渲染到Bitmap,一个是渲染到FB上。 2、hardware可能会有一些操作不支持。 两者相同: 都是开了一个buffer,把View画到这个buffer上面去。

    LAYER_TYPE_NONE 这个就比较简单了,不为这个View树建立单独的layer

    PS:GLSurfaceView和WebView默认Layertype都是none。

    GLSurfaceView: 给GLSurfaceView设置为software或者hardware后,发现什么也画不出来了。得出结论:GLSurfaceView的Layer type只能是none

    WebView: 以前使用WebView时碰到过一个问题,如果在WebView上面使用Animation,WebView的绘画区域不动。当时的解决方案是在进行动画之前对WebView进行截屏(drawingcache)。按上面的道理试了一下,设置一个hardware或者software的layer就OK了。

    现在又碰到了另外一个问题,打开硬件加速后,在一些机器上面(我的是3.2)WebView有时会出现某一块区域白屏的问题。默认的layer type是none,改为hardware也不行,设置为software就解决了。当然关闭硬件加速也好了,可是那样的话程序整体就比较慢了。所以最终方案是整体硬件加速,出问题的WebView设置software

    补充于2012.4.21:

    加上这一句,可以让3D的绘制更快一些:getHolder().setType(SurfaceHolder.SURFACE_TYPE_HARDWARE);

    补充于2012.4.22

    先说问题:  在硬件加速开启的情况下GLSurfaceView一旦被从View树上摘下来,会使整个窗口背景变黑,即使设置layer type为software也不管用。  经过两天的排查,发现了原因,我的程序是在C层由drawFrame(属于GLThread线程)来驱动进行绘画,当GLSurfaceView被摘下来时,GLSurfaceView的destroy方法被调用,我在destroy方法(属于UI线程)中直接调用 了GLThread线程的结束方法。而GLSurfaceView.creat,sizeChanged,destroyed在UI线程,Render.create,sizeChanged,drawFrame在GLThread线程。因此,出现了UI线程直接调用GLThread线程的方法的问题。最终通过GLSurfaceView.queueEvent向GLThread线程发送Runnable,问题得到解决。  看来,还是软渲染的容错能力比较强,一开硬件加速,底层就比较脆弱了。  结论:一定要搞清楚哪个是UI线程,哪个是GLThread线程。

     补上几个寻找问题过程中发现的知识点: hardware acclerator是对整个窗口进行加速,在硬件加速打开时View.isHardwareAcclerator返回true。但每个View可能被渲染到的Canvas是不同的,比如View可能被通过setLayer设置了Layer,这时,Canvas.isHardwareAccelerator返回false Android提供了三种硬件加速是否打开的控制级别,分别是Application,Activity,Window,View。这个可以参考Dev Guide

  • 相关阅读:
    linux ssh 安装、安全设置
    STL底层数据结构实现
    谷粒商城踩坑汇总(分布式高级篇)
    谷粒商城踩坑汇总(分布式基础(全栈开发篇))
    使用Vagrant 后发现虚拟机磁盘空间爆满的血泪填坑记
    Tomcat启动时,控制台和IDEA控制台中文乱码解决方案
    Unknown initial character set index '255' received from server. Initial client character set can be ... 解决方法
    idea打包成功但是resource下的文件没有复制到classes文件夹的解决方法
    tomcat控制台中文乱码怎么处理
    idea中tomcat启动时控制台中文乱码解决
  • 原文地址:https://www.cnblogs.com/heavenhome/p/7676649.html
Copyright © 2020-2023  润新知