提升webView性能(应该与本地Web浏览器的性能相同)

44

我的经验是,在WebView中加载网站比在Android Web浏览器中执行相同操作要慢得多。我可以看到在我的Apache日志中所有文件都已加载,但在WebView控件中显示页面需要几秒钟的时间。然而,在本机Web浏览器中打开相同的页面将立即显示。似乎渲染受到了某种限制。

我们需要应用哪些浏览器设置才能达到与在本机Web浏览器中加载页面相同的性能?

我们目前的设置:

browserset.setLoadsImagesAutomatically(true);
browserset.setJavaScriptEnabled(true);
browserset.setDatabaseEnabled(true);
browserset.setDatabasePath("data/data/com.xxx/databases");
browserset.setDomStorageEnabled(true);
browserset.setRenderPriority(WebSettings.RenderPriority.HIGH);
browserset.setSupportZoom(false);
browserset.setUserAgentString( browserset.getUserAgentString() + " (XY ClientApp)" );
browserset.setAllowFileAccess(true);
browserset.setSavePassword(false);
browserset.setSupportMultipleWindows(false);
browserset.setAppCacheEnabled(true);
browserset.setAppCachePath("");
browserset.setAppCacheMaxSize(5*1024*1024);
2个回答

18

我终于找到了导致 Android Webview 性能问题的原因。 请注意下面的图像... 从 OnPageStarted 到 OnPageFinished,它花费了12秒的时间。 因为它需要加载CSS、JavaScript以及... AJAX...

调试窗口:

我注意到 JQuery 和 JQueryMobile 需要加载Html中的所有DOM结构。所以,如果我在 OnPageFinished 后懒加载 JavaScript,它应该会更快地显示页面。

首先,在 JQuery 中使用 setTimeout 替换 $(document).ready(function() {});。然后再使用懒加载 JavaScript 文件。

最终的 HTML 和 JavaScript 如下:

<script src="/css/j/lazyload-min.js" type="text/javascript"></script>

        <script type="text/javascript" charset="utf-8"> 

       loadComplete(){

          //instead of $(document).ready(function() {});

       }

        function loadscript()

        {

LazyLoad.loadOnce([

 '/css/j/jquery-1.6.2.min.js',

 '/css/j/flow/jquery.flow.1.1.min.js',  

 '/css/j/min.js?v=2011100852'

], loadComplete);

        }

        setTimeout(loadscript,10);

        </script>

你可以在http://wonko.com/post/painless_javascript_lazy_loading_with_lazyload找到lazyload-min.js。

这样做后,您可以看到下面的日志图片:

after change the javascript

现在,从OnPageStarted到OnPageFinished只需要2秒钟。

我在https://wenzhang.baidu.com/page/view?key=22fe27eabff3251f-1426227431发布了这篇文章,但是它是用中文写的。 :)


1
兄弟,链接坏了。没关系,你的回答提供了足够的信息 :) - Skynet
链接已经失效。@Skynet,你能告诉我如何实现吗? - Lavanya Velusamy
@lavanya lavan 我刚刚更新了新链接。但是这篇文章太旧了,而且我已经很长时间没有开发安卓应用了。我认为应该有新的解决方案。你可以使用Ionic、ReactJS等。 - DennisZhong
我找不到任何解决方案。https://stackoverflow.com/questions/46260830/android-webapp-into-android-app...如果您找到任何解决方案,请帮助我。 - Lavanya Velusamy

17

我遇到了类似的问题,经过一番繁重的调试后发现本机浏览器和WebView浏览器似乎使用不同的缓存。

可以使用以下代码禁用WebView缓存,这使得WebView对我来说更快(尽管牺牲了缓存功能)。请注意,它使用了私有API,因此使用它会冒着未来版本代码损坏的风险:

try
{
  Method m = CacheManager.class.getDeclaredMethod("setCacheDisabled", boolean.class);
  m.setAccessible(true);
  m.invoke(null, true);
}
catch (Throwable e)
{
  Log.i("myapp","Reflection failed", e);
}

6
"CacheManager.class" 类不可用。 - Sush
2
尝试这个: Method m = Class.forName("android.webkit.CacheManager").getDeclaredMethod("setCacheDisabled", boolean.class); - Ammar
本地浏览器和 WebView 浏览器缓存之间有什么区别? - Xiaozou
1
这完全没有帮助。Ammar的回答也不行。 - Siwei
这可能对Ammar、Sush和Siwei有所帮助。尝试{ val m: Method = ServiceWorkerWebSettingsCompat.CacheMode::class.java.getDeclaredMethod( "setCacheDisabled", Boolean::class.javaPrimitiveType ) m.isAccessible = true m.invoke(null, true) } catch (e: Throwable) { Log.i("myapp", "Reflection failed", e) } - Subratsss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接