Chế độ xem web chậm


174

Tôi android webviewschậm. Đây là trên tất cả mọi thứ, từ điện thoại đến 3.0+máy tính bảng với thông số kỹ thuật đầy đủ hơn

Tôi biết rằng các lần xem web được cho là "hạn chế" nhưng tôi thấy các ứng dụng web được thực hiện với khoảng cách điện thoại phải sử dụng tất cả các loại CSS3JQueryphép thuật, chúng chạy rất tốt và nhanh chóng

Vì vậy, tôi đang thiếu một cái gì đó, có một số loại myWebview.SPEEDHACK(1)mà tôi có thể sử dụng để tăng tốc mọi thứ?

Ngoài ra, đôi khi nội dung của webview của tôi chỉ đơn giản là không tải, thay vì tải chậm, nó sẽ không tải. Tài sản tôi đang thử nghiệm được lưu trữ cục bộ, không có lỗi.


3
Âm thanh như bạn cần phải đăng một số mã.
Jasoneer

1
có thể trùng lặp hiệu suất
Ken White

1
@KenWhite ngoại trừ câu hỏi này có nhiều câu trả lời hơn, câu hỏi này có câu trả lời tốt hơn và toàn diện hơn, câu hỏi này có số lượt xem nhiều gấp đôi, cả hai câu hỏi đều trên hai tuổi, phiên bản android cả hai câu hỏi này được áp dụng đều lỗi thời ... chính xác bạn có thoát khỏi việc gắn cờ này không?
CQM

@CQM: Câu hỏi này được hệ thống tự động gắn cờ vì câu trả lời trùng lặp của George Mays bên dưới. Nếu câu trả lời của anh ta có thể được lặp lại nguyên văn như câu trả lời cho nhiều bài viết, một trong số đó là một bản sao của bài viết khác. Câu hỏi liên kết đã được đăng (và trả lời) đầu tiên dựa trên ngày đăng. Một bản sao là một bản sao và bài đăng đầu tiên là bản gốc (và các câu trả lời cũng sớm hơn). Tôi không nhận được gì khi gắn cờ này (và không ở vị trí đầu tiên).
Ken White

1
Ngoài ra, không sử dụng sự kiện nhấp chuột trong ứng dụng của bạn, nó sẽ thêm độ trễ 300ms để phản hồi mỗi lần nhấp, để xác định đó là nhấp chuột. Thay vào đó sử dụng touchstart tốt hơn. Tôi đã tạo một clickhandler sử dụng hai sự kiện và lấy sự kiện được kích hoạt đầu tiên. Tôi sử dụng 'clickstart click', vì vậy nó vẫn hoạt động mà không cần màn hình cảm ứng.
Codebeat

Câu trả lời:


132

Nó phụ thuộc vào ứng dụng web đang được tải. Hãy thử một số cách tiếp cận dưới đây:

Đặt mức độ ưu tiên kết xuất cao hơn (không dùng từ API 18+):

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

Bật / tắt tăng tốc phần cứng:

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

Vô hiệu hóa bộ đệm (nếu bạn gặp vấn đề với nội dung của mình):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

46
Tôi hiểu tại sao đặt mức độ ưu tiên kết xuất thành cao sẽ giúp nó nhanh hơn. Nhưng tại sao lại tắt bộ đệm?
Dimas Kotvan

39
Phương thức setRederP Warriority không được dùng nữa, hãy xem developer.android.com/reference/android/webkit/WebSinstall.html
Victor Ionescu

6
Liên kết chính xác cho setRenderP Warriority ở đây
Christopher Perry

2
Tôi để mã này ở đâu trong Ứng dụng của mình? Xin hãy giúp đỡ - Tôi có cùng một vấn đề về nhiệm vụ quan trọng trên WebView
Levchik

6
Tại sao bạn tắt bộ nhớ cache?
Hassy31

52

Thêm điều này android:hardwareAccelerated="true"vào bảng kê khai là điều duy nhất cải thiện đáng kể hiệu suất cho tôi

Thêm thông tin ở đây: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel


1
Điều này chỉ dành cho API v11 / Android 3.x trở lên
Ludwo

6
Hãy cẩn thận, có một WebViews tăng tốc phần cứng liên quan đến lỗi, như đã nêu trong câu hỏi stackoverflow.com/q/17059899/225341
Victor Ionescu

1
Tôi đã nhận thấy rằng tắt tăng tốc phần cứng thực sự làm cho ứng dụng của tôi nhanh hơn. Với android:hardwareAccelerated="true"hoạt ảnh 3D 3D đã bị trì hoãn lâu trước khi bắt đầu, việc cuộn DIV bên trong các DIV có thể cuộn khác không hoạt động và ứng dụng không ổn định hơn.
Ernests Karlsons

1
giá trị mặc định là "true" nếu bạn đặt minSdkVersion hoặc targetSdkVersion thành "14" hoặc cao hơn;
Vihaan Verma

37

Giải pháp cho chúng tôi là ngược lại. Chúng tôi chỉ vô hiệu hóa khả năng tăng tốc phần cứng trên WebView (chứ không phải trên toàn bộ ứng dụng trong tệp kê khai) bằng cách sử dụng mã này:

if (Build.VERSION.SDK_INT >= 11){
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Hiện tại hoạt hình CSS3 mượt mà hơn. Chúng tôi đang sử dụng Android 4.0.

Thêm thông tin tại đây: https://code.google.com.vn/p/android/issues/detail?id=17352


4
Thật không may, điều này cũng ngăn thành phần video html5 hoạt động = /
Ja͢ck

Không để ý. Chúng tôi đã sử dụng chế độ xem video để phát video: may mắn thay, chúng tôi chỉ cần một video toàn màn hình. Như một giải pháp thay thế, có thể có chế độ xem web trong suốt và chế độ xem video phát ở chế độ nền, mặc dù tôi biết đó không phải là điều tương tự.
Ena

1
Có một vấn đề khác với sửa chữa này. Trong khi chạm vào webview, đồ họa có một chút xa cách. Ví dụ: nếu bạn có một hình ảnh với một cirle, bạn sẽ thấy các ô vuông nhỏ (pixel) trên đó thay vì đường thẳng. Tôi có thể nói rằng với bản sửa lỗi Android 4.3 là vô ích, nó không phải là vấn đề về hiệu năng.
Ena

Xin lỗi một chút mới cho Android. Đây có phải là có thể dán trực tiếp trong tệp kê khai Android rằng tệp kê khai là XML. Hoặc điều này được cho là được xác thực trong mã nguồn khi tải webview. Xin lỗi cho câu hỏi của Noob.
xMythicx

1
Sau khi thêm, nhận được lỗi nàyWebView not displayed because it is too large to fit into a software layer (or drawing cache), needs 11534400 bytes, only 8294400 available
developer1011

14

Tôi nghĩ rằng những điều sau đây hoạt động tốt nhất:

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 có công cụ Chromium cho WebView. Tôi đoán nó hoạt động tốt hơn với khả năng tăng tốc phần cứng.


1
Điều này làm việc cho tôi trên WebViews với hình ảnh động và cuộn kém
cal

Là tôi hay 'người khác' của bạn làm giống như 'nếu' của bạn?
Codebeat

Erwinus một dành cho loại_SOFTWARE và phần cứng khác
user2582318

9

Tôi đã có vấn đề tương tự và tôi đã phải giải quyết nó. Tôi đã thử các giải pháp này, nhưng cuối cùng hiệu suất, ít nhất là cho việc cuộn không cải thiện chút nào. Vì vậy, đây là cách giải quyết mà tôi đã thực hiện và giải thích lý do tại sao nó làm việc cho tôi.

Nếu bạn có cơ hội khám phá các sự kiện kéo, chỉ một chút, bằng cách tạo Lớp "MiWebView", ghi đè phương thức "onTouchEvent" và ít nhất là in thời gian mà mọi sự kiện kéo xảy ra, bạn sẽ thấy chúng được tách ra trong thời gian cho (xuống) 9ms đi. Đó là một khoảng thời gian rất ngắn ở giữa các sự kiện.

Hãy xem Mã nguồn WebView và chỉ thấy chức năng onTouchEvent. Nó chỉ là không thể để nó được xử lý bởi bộ xử lý trong vòng chưa đầy 9ms (Hãy cứ mơ đi !!!). Đó là lý do tại sao bạn liên tục thấy "Bỏ lỡ một lực cản khi chúng tôi đang chờ phản hồi của WebCore để liên lạc." thông điệp. Mã không thể được xử lý đúng thời gian.

Làm thế nào để khắc phục nó? Đầu tiên, bạn không thể viết lại mã onTouchEvent để cải thiện nó, nó chỉ là quá nhiều. Nhưng, bạn có thể "chế nhạo nó" để giới hạn tốc độ sự kiện cho các chuyển động kéo, hãy nói là 40ms hoặc 50ms. (điều này phụ thuộc vào bộ xử lý).

Tất cả các sự kiện chạm đều diễn ra như sau: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Vì vậy, chúng ta cần phải giữ các chuyển động XUỐNG và LÊN và lọc tỷ lệ MOVE (đây là những kẻ xấu).

Và đây là một cách để làm điều đó (bạn có thể thêm nhiều loại sự kiện như chạm 2 ngón tay, tất cả những gì tôi quan tâm ở đây là cuộn một ngón tay).

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

Tất nhiên Sử dụng lớp này thay vì WebView và bạn sẽ thấy sự khác biệt khi cuộn.

Đây chỉ là một cách tiếp cận giải pháp, nhưng vẫn chưa được thực hiện đầy đủ cho tất cả các trường hợp độ trễ do chạm màn hình khi sử dụng WebView. Tuy nhiên đó là giải pháp tốt nhất tôi tìm thấy, ít nhất là cho nhu cầu cụ thể của tôi.


Tôi muốn chỉ ra rằng mã nguồn webview bạn đã đăng là từ năm 2010
CQM

Điều này không hoạt động, nó không cuộn trơn tru, tôi không thể cảm thấy sự khác biệt.
neevek

Tôi đã thực hiện cài đặt giới hạn này lên tới 80, nhưng thực tế nó dường như không cải thiện hiệu suất nhưng nó có thể bắt được một số sự kiện di chuyển. nó làm gì cho bạn?
Ragnar

Đã đọc rằng một sự kiện nhấp chậm hơn 6 lần mà chạm vào sự kiện chạm. Để tránh sự chậm trễ, bạn có thể sử dụng $ ('# nút'). On ('touchstart click', function () {action here; return false;});
Codebeat

Ngoài ra, không sử dụng sự kiện nhấp chuột trong các ứng dụng html của bạn, nó sẽ thêm độ trễ 300ms để phản hồi trên mỗi lần nhấp, để xác định đó là nhấp chuột. Thay vào đó sử dụng touchstart tốt hơn. Tôi đã tạo một clickhandler sử dụng hai sự kiện và lấy sự kiện được kích hoạt đầu tiên. Tôi sử dụng 'clickstart click', vì vậy nó vẫn hoạt động mà không cần màn hình cảm ứng.
Codebeat

9

Tôi đã thử tất cả các đề xuất để khắc phục sự cố hiệu suất kết xuất trong ứng dụng phonegap của mình. Nhưng không có gì thực sự làm việc.

Cuối cùng, sau cả ngày tìm kiếm, tôi đã thực hiện nó. Tôi đặt trong thẻ (không phải thẻ) của AndroidManifest của tôi

<application android:hardwareAccelerated="false" ...

Bây giờ ứng dụng này hoạt động theo cách nhanh chóng giống như webbrowser của tôi. Có vẻ như, nếu tăng tốc phần cứng không phải lúc nào cũng là tính năng tốt nhất ...

Vấn đề chi tiết tôi gặp phải: https://stackoverflow.com/a/24467920/3595386


2
Vô hiệu hóa khả năng tăng tốc phần cứng đã làm tôi kinh khủng,
webview

5

Không có câu trả lời nào là không hữu ích cho tôi.

Cuối cùng tôi đã tìm ra lý do và giải pháp. Lý do là rất nhiều bộ lọc CSS3 (bộ lọc, bộ lọc -webkit).

Giải pháp

Tôi đã thêm phát hiện WebView trong tập lệnh trang web để thêm lớp "chất lượng thấp" vào phần thân HTML. BTW. Bạn có thể dễ dàng theo dõi WebView bằng cách đặt tác nhân người dùng trong cài đặt WebView. Sau đó, tôi đã tạo quy tắc CSS mới

body.lowquality * { filter: none !important; }

Lúng túng khi 5 năm sau có rất ít lý do để sử dụng webview mặc dù các thiết bị nhanh hơn, hiệu suất tương thích trình duyệt di động hơn đã được cải thiện rất nhiều và các lý do khác. Cảm ơn đã xem xét nó mặc dù!
CQM

@CQM Tôi gặp vấn đề tương tự, tôi đã tìm ra giải pháp nên tôi muốn chia sẻ nó :)
l00k

Tôi chỉ là người lãnh đạm, đây là một trong những câu hỏi lâu đời nhất của tôi, cảm ơn một lần nữa!
CQM

1
Thật vô lý khi đây là một vấn đề trong năm 2016/2017. Không có bộ lọc CSS nào có thể thách thức đối với bất kỳ GPU di động nào.
Adam Leggett

4

Nếu chỉ có một vài thành phần trong chế độ xem web của bạn chậm hoặc bị lag, hãy thử thêm phần này vào các phần tử css:

transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

Đây là speedhack duy nhất thực sự có ảnh hưởng đến webview của tôi. Nhưng hãy cẩn thận đừng lạm dụng nó! (bạn có thể đọc thêm về hack trong bài viết này .)


1
Sử dụng will-change: transform.
Adam Leggett


3

Nếu bạn đang liên kết với onclicksự kiện, nó có thể bị chậm trên màn hình cảm ứng.

Để làm cho nó nhanh hơn, tôi sử dụng fastclick , sử dụng các sự kiện chạm nhanh hơn nhiều để bắt chước sự kiện nhấp chuột.


fastclick không còn được phát triển ... có những sự kiện liên lạc chậm và tôi chỉ cần nó để làm việc và tìm thấy với jquery vấn đề tốc độ có thể được làm việc xung quanh sử dụng $('#').on('touchstart', function() {...});như trái ngược với onclick
CrandellWS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.