首页 文章

Android webview很慢

提问于
浏览
152

我的 android webviews 很慢 . 这是从手机到 3.0+ 平板电脑的所有内容,具有足够的规格

我知道网页浏览应该是"limited"但是我看到网络应用程序完成了手机间隙,必须使用各种 CSS3JQuery 法术,它们运行得很好而且速度很快

所以我错过了什么,是否有某种 myWebview.SPEEDHACK(1) 可以用来加快速度?

另外,有时我的webview的内容只是不加载,而不是慢慢加载,它只是不会加载 . 我正在测试的资产存储在本地,没有错误 .

10 回答

  • 7

    这取决于正在加载的Web应用程序 . 尝试以下一些方法:

    Set higher render priority (deprecated from API 18+):

    webview.getSettings().setRenderPriority(RenderPriority.HIGH);
    

    Enable/disable hardware acceleration:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        // chromium, enable hardware acceleration
        webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    } else {
        // older android version, disable hardware acceleration
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
    

    Disable the cache (if you have problems with your content):

    webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    
  • 3

    在清单中添加此 android:hardwareAccelerated="true" 是唯一能够显着改善性能的方法

    更多信息:http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

  • 2

    我们的解决方案恰恰相反 . 我们使用以下代码仅禁用WebView上的硬件加速(而不是清单中的整个应用程序):

    if (Build.VERSION.SDK_INT >= 11){
        webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
    

    CSS3动画现在更流畅了 . 我们使用的是Android 4.0 .

    更多信息:https://code.google.com/p/android/issues/detail?id=17352

  • 8

    我认为以下效果最好:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    } else {
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
    

    Android 19为WebView提供了Chromium引擎 . 我猜它在硬件加速方面效果更好 .

  • 3

    我遇到了同样的问题,我不得不解决这个问题 . 我尝试了这些解决方案,但最后的表现,至少对于滚动来说根本没有改进 . 所以这里是我所做的工作,以及为什么它对我有用的解释 .

    如果你有机会通过创建一个“MiWebView”类,覆盖“onTouchEvent”方法并至少打印每个拖拽事件发生的时间来探索拖拽事件,你会看到它们是分开的及时(下至)9ms之遥 . 事件之间的时间非常短暂 .

    看一下WebView Source Code,看看onTouchEvent函数 . 它不可能在不到9ms的时间内被处理器处理(继续做梦!!!) . 按时处理's why you constantly see the 1326759 message. The code just can' .

    怎么解决?首先,你不能重写onTouchEvent代码来改进它,它太多了 . 但是,你可以“嘲笑它”以限制拖动动作的事件率,比方说40ms或50ms . (这取决于处理器) .

    所有触摸事件都是这样的:ACTION_DOWN - > ACTION_MOVE ...... ACTION_MOVE - > ACTION_UP . 所以我们需要保持DOWN和UP运动并过滤MOVE率(这些都是坏人) .

    这是一种方法(你可以添加更多的事件类型,如2指触摸,我感兴趣的是这里的单指滚动) .

    import android.content.Context;
    import android.view.MotionEvent;
    import android.webkit.WebView;
    
    
    public class MyWebView extends WebView{
    
        public MyWebView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
    
        private long lastMoveEventTime = -1;
        private int eventTimeInterval = 40;
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
    
            long eventTime = ev.getEventTime();
            int action = ev.getAction();
    
            switch (action){
                case MotionEvent.ACTION_MOVE: {
                    if ((eventTime - lastMoveEventTime) > eventTimeInterval){
                        lastMoveEventTime = eventTime;
                        return super.onTouchEvent(ev);
                    }
                    break;
                }
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_UP: {
                    return super.onTouchEvent(ev);
                }
            }
            return true;
        }
    }
    

    当然使用此类而不是WebView,您将看到滚动时的差异 .

    这只是解决方案的一种方法,但在使用WebView时由于屏幕触摸而导致的所有延迟情况仍未完全实现 . 然而,这是我发现的最佳解决方案,至少对我的具体需求而言 .

  • 2

    我尝试了所有提议来修复我的phonegap应用中的渲染性能问题 . 但没有任何结果 .

    最后,经过一整天的搜索,我成功了 . 我在AndroidManifest的标签(不是标签)中设置

    <application android:hardwareAccelerated="false" ...
    

    现在,该应用程序的行为方式与我的webbrowser相同 . 似乎,如果硬件加速并不总是最好的功能......

    我遇到的详细问题:https://stackoverflow.com/a/24467920/3595386

  • 45

    如果您的webview中只有一些组件缓慢或滞后,请尝试将其添加到元素css:

    transform: translate3d(0,0,0);
    -webkit-transform: translate3d(0,0,0);
    

    这是唯一真正对我的webview产生影响的速度 . 但要注意不要过度使用它! (您可以在this article中阅读有关黑客的更多信息 . )

  • 116

    这些答案都没有对我有帮助 .

    最后,我找到了理由和解决方案 . 原因是很多CSS3过滤器(filter,-webkit-filter) .

    Solution

    我在网页脚本中添加了WebView检测,以便向HTML主体添加类“低质量” . BTW . 您可以通过在WebView设置中设置user-agent来轻松跟踪WebView . 然后我创建了新的CSS规则

    body.lowquality * { filter: none !important; }
    
  • 9

    试试这个:

    mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    
  • 31

    如果您绑定到 onclick 事件,触摸屏上可能会很慢 .

    为了加快速度,我使用fastclick,它使用更快的触摸事件来模仿click事件 .

相关问题