我的
android webviews
很慢。从手机到规格充足的3.0+
平板电脑,一切都如此
我知道网络视图应该是“有限的”,但我看到网络应用程序是用手机间隙完成的,它们必须使用各种
CSS3
和JQuery
魔法,它们运行得很好而且速度很快
所以我错过了一些东西,是否有某种
myWebview.SPEEDHACK(1)
可以用来加快速度?
另外,有时我的 webview 的内容只是不加载,而不是缓慢加载,它只是不会加载。我正在测试的资产存储在本地,没有错误。
这取决于正在加载的网络应用程序。尝试以下一些方法:
设置更高的渲染优先级(从 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);
在清单中添加此
android:hardwareAccelerated="true"
是唯一显着提高我的性能的事情
更多信息在这里: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel
我们的解决方案恰恰相反。我们使用以下代码仅在 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
我认为以下效果最好:
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 引擎。我想它与硬件加速效果更好。
我尝试了所有建议来解决我的phonegap应用程序中的渲染性能问题。但没有什么真正起作用。
终于,经过一整天的寻找,我成功了。我在 AndroidManifest 的标签(不是标签)中设置
<application android:hardwareAccelerated="false" ...
现在该应用程序的运行速度与我的网络浏览器相同。看起来,如果硬件加速并不总是最好的功能......
我也遇到了同样的问题,我必须解决它。我尝试了这些解决方案,但最终性能(至少对于滚动而言)根本没有改善。所以这里是我执行的解决方法以及它为什么对我有用的解释。
如果您有机会探索一下拖动事件,只需创建一个“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 时由于屏幕触摸而导致的所有滞后情况完全实现。然而,这是我找到的最好的解决方案,至少满足我的特定需求。
这些答案都对我没有帮助。
终于找到原因和解决办法了。原因是有很多 CSS3 过滤器(filter、-webkit-filter)。
解决方案
我在网页脚本中添加了对 WebView 的检测,以便向 HTML 正文添加“lowquality”类。顺便提一句。您可以通过在 WebView 设置中设置 user-agent 来轻松跟踪 WebView。然后我创建了新的 CSS 规则
body.lowquality * { filter: none !important; }
如果您的 web 视图中只有少数几个组件缓慢或滞后,请尝试将其添加到元素 css 中:
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);
这是唯一真正对我的网络视图产生影响的速度黑客。但要注意不要过度使用! (您可以在本文中阅读有关黑客攻击的更多信息。)
试试这个:
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
尝试过给出的解决方案但不起作用的其他人可以尝试使用此:
settings.setDomStorageEnabled(true);