2010-09-06 30 views
40

Trải nghiệm của tôi là tải trang web trong WebView chậm hơn nhiều so với thực hiện các tác vụ tương tự trong Trình duyệt web Android. Tôi có thể thấy rằng tất cả các tập tin đã được tải trong nhật ký Apache của tôi, nó sẽ mất một vài giây cho đến khi trang được hiển thị trong điều khiển WebView, tuy nhiên. Việc mở cùng một trang trong trình duyệt Web gốc sẽ dẫn đến hiển thị ngay lập tức. Dường như việc dựng hình bằng cách nào đó bị tê liệt.Nâng cao hiệu suất của webView (nên có cùng hiệu suất như Trình duyệt web gốc)

Chúng tôi phải áp dụng cài đặt trình duyệt nào để đạt được hiệu suất giống như tải trang trong trình duyệt web gốc?

thiết lập hiện tại của chúng tôi:

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

Trả lời

17

Tôi chạy vào một vấn đề tương tự, và sau khi một số lỗi nặng nhận thấy trình duyệt bản địa và trình duyệt WebView dường như được sử dụng lưu trữ khác nhau.

Mã này có thể được sử dụng để vô hiệu hóa bộ nhớ cache WebView và làm cho WebView nhanh hơn nhiều đối với tôi (mặc dù không phải do bộ nhớ đệm). Lưu ý rằng nó sử dụng các API riêng, vì vậy bằng cách sử dụng nó, bạn đang mạo hiểm mã sẽ phá vỡ trong phiên bản tương lai:

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

lớp 'CacheManager.class' không có sẵn – Sush

+1

thử điều này: Phương pháp m = Class.forName (" android.webkit .CacheManager "). GetDeclaredMethod (" setCacheDisabled ", boolean.class); – Ammar

+0

Tôi nên thêm mã này ở đâu? –

17

cuối cùng tôi nhận được lý do của android webview vấn đề hiệu suất kém. Lưu ý hình ảnh bên dưới ... Đã sử dụng 12 giây từ OnPageStarted thành OnPageFinished. Bởi vì nó sẽ tải CSS, javascript và ... AJAX ...

the debug window:

Tôi nhận thấy rằng JQuery và JQueryMobile cần tải tất cả struct DOM trong Html.So nếu tôi lười biếng tải javascript sau OnPageFinished, nó nên hiển thị trang nhanh hơn.

Sử dụng đầu tiên setTimeout thay vì $ (tài liệu) .ready (function() {}); trong JQuery.Sau đó sử dụng tệp tin lazyload javascript.

Các html thức và javascript là:

<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> 

Bạn có thể tìm lazyload-min.js trong http://wonko.com/post/painless_javascript_lazy_loading_with_lazyload

Sau khi làm điều đó, bạn sẽ nhìn thấy hình ảnh đăng nhập dưới đây:

after change the javascript

Hiện tại, chỉ mất 2 giây từ OnPageStarted đến OnPageFinished.

tôi đăng bài viết tại https://wenzhang.baidu.com/page/view?key=22fe27eabff3251f-1426227431

Nhưng nó được viết bằng tiếng Hoa :)

+1

Làm phiền liên kết bị hỏng. Không bao giờ nhớ câu trả lời của bạn cung cấp đủ thông tin :) – Skynet

+0

Liên kết bị hỏng @ Skynet bạn có thể cho tôi biết cách đạt được nó không? –

+0

@lavanya lavan Tôi đã cập nhật liên kết mới ngay bây giờ. Nhưng bài viết này quá cũ và tôi không phát triển Android trong thời gian dài. Tôi nghĩ rằng nó nên có giải pháp mới.Bạn có thể sử dụng ionic, reactjs, v.v. – DennisZhong