2010-09-06 103 views
40

我的經驗是,在WebView中加載網站比在Android Web瀏覽器中執行相同操作要慢得多。我可以看到,所有文件都已加載到我的Apache日誌中,但在WebView控件中顯示該頁面之前需要幾秒鐘的時間。在原生Web瀏覽器中打開相同的頁面將立即顯示。看起來,渲染是癱瘓的。增強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); 

回答

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 2014-05-14 06:06:50

+1

試試這個: 方法M =的Class.forName(「android.webkit .CacheManager「)。getDeclaredMethod(」setCacheDisabled「,boolean.class); – Ammar 2014-09-25 22:09:23

+0

我應該在哪裏添加此代碼? – 2015-06-17 07:02:12

17

我終於得到了機器人的WebView壞性能問題的原因。 注意下面的圖片...它使用了從OnPageStarted到OnPageFinished的12秒鐘。因爲它應該加載CSS,JavaScript和AJAX ... ...

the debug window:

我注意到,jQuery和JQueryMobile需要的,如果我懶加載OnPageFinished後的JavaScript,它應該加載所有DOM結構中Html.So顯示頁面更快。

首先使用setTimeout而不是$(document).ready(function(){});在JQuery中。然後使用lazyload 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

Bro鏈接已損壞。不要緊,你的答案提供了足夠的信息:) – Skynet 2016-02-10 04:16:16

+0

鏈接被打破。@天網你能告訴我如何實現它嗎? – 2017-09-07 11:33:24

+0

@lavanya lavan我剛更新了新鏈接。但是這篇文章太老了,我很久沒開發android。我認爲它應該有新的解決方案。你可以使用離子,反應等等。 – DennisZhong 2017-09-07 16:07:49