Android Webview慢


174

android webviews很慢 从手机到3.0+平板电脑,一切都超过规格

我知道网络浏览量应该是“有限的”,但我发现网络应用程序必须通过电话间隙来完成,并且必须使用各种手段CSS3和手段JQuery,它们运行良好且速度很快

所以我缺少了什么,是否myWebview.SPEEDHACK(1)可以使用某种方法来加快速度?

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


3
听起来您需要发布一些代码。
Jasoneer 2011年


1
@KenWhite除了这个问题有更多的答案,这个问题有更好和更全面的答案,这个问题有两倍的观点,两个问题都超过两年了,这两个问题都适用的android版本已经过时了...什么您到底是从标记这个问题中摆脱出来的?
CQM 2014年

@CQM:由于下面的乔治·梅斯重复答案,系统已自动标记此问题。如果他的答案可以逐字重复作为多个帖子的答案,那么其中一个就是另一个的重复。链接的问题首先根据发布日期发布(并回答)。重复就是重复,第一个帖子就是原始帖子(答案也更早)。我从标记此一无所获(并且一开始就没有)。
肯·怀特

1
另外,请勿在您的应用中使用click事件,它会增加300ms的延迟来响应每次点击,从而确定是一次点击。最好改用touchstart。我制作了一个使用两个事件并接受第一个触发事件的clickhandler。我使用“触摸开始点击”,因此即使没有触摸屏也可以使用。
2015年

Answers:


132

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

设置更高的渲染优先级(从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);

46
我知道为什么将渲染优先级设置为高会更快。但是为什么要关闭缓存?
Dimas Kotvan 2013年

39
不建议使用setRederPriority方法,请参阅developer.android.com/reference/android/webkit/WebSettings.html
Victor Ionescu

6
setRenderPriority的正确链接在这里
Christopher Perry

2
将此代码放在哪里?请帮助-我在关键任务WebView上
遇到

6
为什么要关闭缓存?
Hassy31年

52

android:hardwareAccelerated="true"在清单中添加此代码是唯一可以显着提高我的性能的东西

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


1
这仅适用于API v11 / Android 3.x及更高版本
Ludwo 2013年

6
请注意,有一个与硬件加速的WebView相关的开放错误,如问题stackoverflow.com/q/17059899/225341
Victor Ionescu

1
我注意到关闭硬件加速实际上会使我的应用程序更快。由于android:hardwareAccelerated="true"CSS 3D动画在开始播放之前有很长的延迟,因此无法在其他可滚动DIV中滚动DIV,并且该应用程序更加不稳定。
Ernests Karlsons,2014年

1
如果将minSdkVersion或targetSdkVersion设置为“ 14”或更高,则默认值为“ true”;
Vihaan Verma

37

对我们而言,解决方案则相反。通过使用以下代码,我们仅在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


4
不幸的是,这还防止了HTML5视频组件工作= /
插孔

没注意到。我们使用了视频视图来播放视频:幸运的是,我们只需要一个全屏视频。作为一种解决方法,可以使Webview透明,并在后台播放视频视图,尽管我知道这不是同一回事。
Ena 2013年

1
此修复程序还有另一个问题。触摸网络视图时,图形会有些变形。例如,如果您的图像带有圆形,您会注意到其上的小正方形(像素)而不是平滑线。我可以说,使用Android 4.3修复程序是没有用的,它没有性能问题。
Ena 2013年

抱歉,android有点新功能。是否可直接将其粘贴到android清单中,因为清单文件是XML?还是应该在加载Webview时在源代码中对此进行验证。对不起,菜鸟问题。
xMythicx 2014年

1
添加后,出现此错误WebView not displayed because it is too large to fit into a software layer (or drawing cache), needs 11534400 bytes, only 8294400 available
developer1011

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


1
这为我工作与穷人的动画和滚动网页视图
卡尔

是我还是您的“其他”与您的“如果”一样?
Codebeat 2015年

Erwinus一个用于type_SOFTWARE,另一个用于硬件
user2582318

9

我遇到了同样的问题,必须解决。我尝试了这些解决方案,但最后的性能,至少对于滚动没有任何改善。所以在这里,我确实做了工作,并解释了为什么对我有用。

如果您有机会通过创建“ MiWebView”类,覆盖“ onTouchEvent”方法并至少打印每个拖动事件发生的时间来探索拖动事件,那么您会发现它们是分开的及时(最短)9ms之内。在两次事件之间的时间很短。

看一下WebView源代码,然后看看onTouchEvent函数。处理器不可能在不到9ms的时间内完成处理(继续做梦!!!)。这就是为什么您会不断看到“在等待WebCore响应时,您会感到不便的原因”。信息。代码无法按时处理。

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

所有的触摸事件都是这样的:ACTION_DOWN-> ACTION_MOVE ...... ACTION_MOVE-> ACTION_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时触摸屏幕,仍不能完全解决所有滞后情况。但是,这是我发现的最佳解决方案,至少满足了我的特定需求。


我想指出的是,您发布的Webview源代码来自2010年
CQM

这行不通,滚动不流畅,我感觉不到区别。
neevek

我已经实现了将该限制设置为80,但是实际上似乎并没有提高性能,但是确实捕获了一些移动事件。它对您有什么作用?
拉格纳

已了解到单击事件的速度是触摸事件touchstart的6倍。为了避免延迟,您可以使用$('#button')。on('touchstart click',function(){在这里执行操作; return false;});
Codebeat 2014年

另外,请勿在HTML应用程序中使用click事件,它会增加300ms的延迟以响应每次点击,从而确定这是一次点击。最好改用touchstart。我制作了一个使用两个事件并接受第一个触发事件的clickhandler。我使用“ touchstart click”,因此即使没有触摸屏也可以使用。
Codebeat 2015年

8

我尝试了所有建议以解决我的phonegap应用程序中的渲染性能问题。但是没有任何真正的工作。

终于,经过一整天的搜索,我做到了。我在AndroidManifest的标签(而非标签)中设置

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

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

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


2
禁用硬件加速对我来说确实很可怕,
Web视图

5

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

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

我在网页脚本中添加了对WebView的检测,以便将类“ lowquality”添加到HTML正文中。顺便说一句。通过在WebView设置中设置用户代理,可以轻松跟踪WebView。然后我创建了新的CSS规则

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

五年后的尴尬之处是,尽管设备速度更快,使用移动浏览器的兼容性也大大提高了,但是使用Webview的理由却很少。感谢您的关注!
CQM

@CQM我遇到了同样的问题,我找到了解决方案,所以我想分享一下:)
l00k 2016年

我只是在开玩笑,这是我最古老的问题之一,再次感谢!
CQM

1
荒谬的是,这是2016/2017年的问题。对于任何移动GPU来说,任何CSS过滤器都不应该具有挑战性。
亚当·莱格特

4

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

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

这是唯一真正影响我的webview的speedhack。但是请注意不要过度使用它!(您可以在本文中阅读有关hack的更多信息。)


1
使用will-change: transform
亚当·莱格特


3

如果您绑定到onclick事件,则在触摸屏上可能会变慢。

为了使其更快,我使用fastclick,它使用快得多的触摸事件来模仿click事件。


fastclick不再开发了……是的,触摸事件很慢,我只需要它就可以工作,并且使用jquery发现可以解决速度问题$('#').on('touchstart', function() {...});,而不是onclick
CrandellWS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.