2010-11-02 42 views
16

Trong ứng dụng của tôi, tôi đang tải danh sách url bên ngoài trong chế độ xem web và cho phép người dùng lướt qua chúng. Webviews được tải vào một flipper xem. Tôi thấy hiệu suất thực sự xấu trong url tải trên webview. Tôi đã thử mọi thứ từ việc sử dụng bố cục khung để giới hạn số lượt xem web để tải. Tuy nhiên hiệu suất là không thỏa đáng.Hiệu suất Android WebView

Làm cách nào để tối ưu hóa hiệu suất của chế độ xem web? Đây phải là cách sử dụng phổ biến. Tôi có thiếu cái gì đó hiển nhiên không.

thiết lập Webview của tôi là -

webView.setInitialScale(WEBVIEW_SCALE); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setBuiltInZoomControls(false); 
    webView.setWebViewClient(new MyWebViewClient());  
    webView.setOnTouchListener(new OnTouchListener()); 
+0

Bạn có chắc chắn nó không tải dữ liệu từ internet có vấn đề không? – Falmarri

+0

Không. Dữ liệu được tải. Nhưng phải mất nhiều thời gian. – Usha

+1

Tải nhiều trang cùng một lúc là tốn kém - thậm chí tải một trang web là một hoạt động tốn kém. Đặt sang một bên tất cả việc xử lý những thứ như hình ảnh, mở rộng cổng xem vv Ngoài ra còn có những hạn chế về hiệu suất của nhiều kết nối socket đồng thời. Cuối cùng tôi đoán rằng nếu bạn xem nhật ký, bạn sẽ thấy rất nhiều cú đập GC. Nó không phải là thực sự khuyến khích để có nhiều WebView hoạt động cùng một lúc. Với mô tả định lượng về "hiệu suất không thỏa đáng" hoặc thiết bị cầm tay bạn đang chạy, tôi chỉ có thể đoán rằng bạn không thể làm gì để cải thiện nó. – cistearns

Trả lời

1

này đã được thảo luận ở đây: Enhance webView performance (should be the same performance as native Web Browser)

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 duyệt bản địa và WebView trình duyệt dường như đang sử dụng các bộ đệm 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ã break trong phiên bản tương lai sẽ:

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); 
} 
+0

Vì vậy, điều này sẽ vô hiệu hóa bộ nhớ đệm cho mọi WebView được ứng dụng sử dụng? Có cách nào để vô hiệu hóa bộ nhớ đệm chỉ cho một WebView không? Cảm ơn! –

+0

Dường như câu hỏi của tôi có thể được trả lời bằng phương pháp WebSettings '.setCacheMode (WebSettings.LOAD_NO_CACHE); ' –

+0

Mặc dù theo câu hỏi này, nó không hoạt động hoặc chỉ bỏ qua kiểm tra bộ nhớ cache nhưng vẫn lưu vào bộ nhớ cache. http: // stackoverflow.com/questions/5239954/webviews-load-no-cache-setting-still-save-files-to-the-đĩa –

4

Hãy thử điều này:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
} else { 
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 
2

Tôi nghĩ rằng các công việc sau tốt nhất :

if (Build.VERSION.SDK_INT >= 19) { 
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
}  
else { 
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 

Android 19 có Chromium engine cho WebView. Tôi đoán nó hoạt động tốt hơn với tăng tốc phần cứng.

Để biết thêm thông tin Android 4.4 KitKat, the browser and the Chrome WebView

Các vấn đề liên quan