Android webview 慢

问题描述 投票:0回答:11

我的

android webviews
很慢。从手机到规格充足的
3.0+
平板电脑,一切都如此

我知道网络视图应该是“有限的”,但我看到网络应用程序是用手机间隙完成的,它们必须使用各种

CSS3
JQuery
魔法,它们运行得很好而且速度很快

所以我错过了一些东西,是否有某种

myWebview.SPEEDHACK(1)
可以用来加快速度?

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

android performance webview
11个回答
142
投票

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

设置更高的渲染优先级(从 API 18+ 开始弃用):

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

启用/禁用硬件加速:

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);
}

禁用缓存(如果您的内容有问题):

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

57
投票

在清单中添加此

android:hardwareAccelerated="true"
是唯一显着提高我的性能的事情

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


38
投票

我们的解决方案恰恰相反。我们使用以下代码仅在 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


14
投票

我认为以下效果最好:

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 引擎。我想它与硬件加速效果更好。


10
投票

我尝试了所有建议来解决我的phonegap应用程序中的渲染性能问题。但没有什么真正起作用。

终于,经过一整天的寻找,我成功了。我在 AndroidManifest 的标签(不是标签)中设置

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

现在该应用程序的运行速度与我的网络浏览器相同。看起来,如果硬件加速并不总是最好的功能......

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


9
投票

我也遇到了同样的问题,我必须解决它。我尝试了这些解决方案,但最终性能(至少对于滚动而言)根本没有改善。所以这里是我执行的解决方法以及它为什么对我有用的解释。

如果您有机会探索一下拖动事件,只需创建一个“MiWebView”类,覆盖“onTouchEvent”方法并至少打印每个拖动事件发生的时间,您就会发现它们是时间间隔(低至)9 毫秒。事件之间的时间间隔非常短。

看一下WebView源代码,就看到了onTouchEvent函数。处理器在 9 毫秒内处理它是不可能的(继续做梦!!!)。这就是为什么您经常看到“由于我们正在等待 WebCore 的着陆响应而错过了一次阻力”。信息。代码就是无法按时处理。

如何解决?首先,你无法重新编写onTouchEvent代码来改进它,这实在是太多了。但是,您可以“模拟它”,以将拖动动作的事件速率限制为 40 毫秒或 50 毫秒。 (这取决于处理器)。

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

这是一种方法(您可以添加更多事件类型,例如两根手指触摸,我在这里感兴趣的是单指滚动)。

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 时由于屏幕触摸而导致的所有滞后情况完全实现。然而,这是我找到的最好的解决方案,至少满足我的特定需求。


8
投票

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

终于找到原因和解决办法了。原因是有很多 CSS3 过滤器(filter、-webkit-filter)。

解决方案

我在网页脚本中添加了对 WebView 的检测,以便向 HTML 正文添加“lowquality”类。顺便提一句。您可以通过在 WebView 设置中设置 user-agent 来轻松跟踪 WebView。然后我创建了新的 CSS 规则

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

4
投票

如果您的 web 视图中只有少数几个组件缓慢或滞后,请尝试将其添加到元素 css 中:

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

这是唯一真正对我的网络视图产生影响的速度黑客。但要注意不要过度使用! (您可以在本文中阅读有关黑客攻击的更多信息。)


3
投票

试试这个:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

3
投票

如果您绑定到

onclick
事件,在触摸屏上可能会很慢。

为了使其更快,我使用 fastclick,它使用更快的触摸事件来模拟单击事件。


0
投票

尝试过给出的解决方案但不起作用的其他人可以尝试使用此:

settings.setDomStorageEnabled(true);

© www.soinside.com 2019 - 2024. All rights reserved.