Helpex - Trao đổi & giúp đỡ Đăng nhập
177

Của tôi android webviewslà chậm. Điều này có trên mọi thứ, từ điện thoại đến 3.0+máy tính bảng với nhiều thông số kỹ thuật phù hợp

Tôi biết rằng số lần xem web được cho là "có giới hạn" 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ó loại nào myWebview.SPEEDHACK(1)đó mà tôi có thể sử dụng để tăng tốc độ mọi thứ không?

Ngoài ra, đôi khi nội dung của chế độ xem web 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. Nội dung tôi đang thử nghiệm được lưu trữ cục bộ, không có lỗi.

177 hữu ích 5 bình luận 164k xem chia sẻ
10 trả lời 10
136

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 hiển thị cao hơn (không dùng nữa 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);
}

Tắt bộ nhớ cache (nếu bạn gặp sự cố với nội dung của mình):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
136 hữu ích 5 bình luận chia sẻ
53

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

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

53 hữu ích 4 bình luận chia sẻ
37

Giải pháp cho chúng tôi là ngược lại. Chúng tôi đã tắt tính năng tăng tốc phần cứng chỉ trên WebView (thay vì 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);
}

Hình ảnh động CSS3 bây giờ mượt mà hơn. Chúng tôi đang sử dụng Android 4.0.

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

37 hữu ích 5 bình luận chia sẻ
14

Tôi nghĩ những cách sau 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.

14 hữu ích 3 bình luận chia sẻ
10

Tôi đã thử tất cả các đề xuất để khắc phục sự cố hiệu suất hiển thị trong ứng dụng bản đồ điện thoại của mình. Nhưng không có gì thực sự hiệu quả.

Cuối cùng, sau cả ngày tìm kiếm, tôi đã làm được. Tôi đã đặt trong thẻ (không phải thẻ) của AndroidManifest của mình

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

Giờ đây, ứng dụng hoạt động nhanh như trình duyệt web 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 ...

Sự cố chi tiết mà tôi gặp phải: https://stackoverflow.com/a/24467920/3595386

10 hữu ích 1 bình luận chia sẻ
9

Tôi đã gặp 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 thì hiệu suất, ít nhất là đối với việc cuộn không cải thiện chút nào. Vì vậy, đây là công việc mà tôi đã thực hiện và giải thích lý do tại sao nó hoạt động với tôi.

Nếu bạn có cơ hội khám phá các sự kiện kéo, chỉ cần 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 rằng chúng được tách biệt trong thời gian (giảm xuống) 9ms. Đó là 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ỉ cần xem chức năng onTouchEvent. Nó không thể được xử lý bởi bộ vi xử lý trong vòng chưa đầy 9ms (Hãy tiếp tục mơ ước !!!). Đó là lý do tại sao bạn liên tục thấy thông báo "Bỏ lỡ một lực cản khi chúng tôi đang chờ phản hồi của WebCore để chạm xuống." thông điệp. Mã chỉ không thể được xử lý đúng hạn.

Làm thế nào để sửa chữa 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. Tuy nhiên, bạn có thể "mô phỏng nó" để giới hạn tỷ lệ sự kiện cho các chuyển động kéo, giả sử 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 cảm ứng sẽ 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ệ DI CHUYỂN (đâ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 hơ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, vẫn chưa được thực hiện đầy đủ cho tất cả các trường hợp giật lag do chạm vào màn hình khi sử dụng WebView. Tuy nhiên đó là giải pháp tốt nhất mà tôi tìm thấy, ít nhất là cho nhu cầu cụ thể của tôi.

9 hữu ích 5 bình luận chia sẻ
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, -webkit-bộ lọc).

Giải pháp

Tôi đã thêm tính năng phát hiện WebView trong tập lệnh trang web để thêm lớp "chất lượng thấp" vào nội dung 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; }
5 hữu ích 4 bình luận chia sẻ
4

Nếu chỉ có một số thành phần trong chế độ xem web của bạn bị chậm hoặc lag, hãy thử thêm thành 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à lần tăng tốc duy nhất thực sự có ảnh hưởng đến chế độ xem web 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ề vụ hack trong bài viết này .)

4 hữu ích 1 bình luận chia sẻ
3

Thử cái này:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
3 hữu ích 0 bình luận chia sẻ
3

Nếu bạn đang ràng buộc với onclicksự kiện, sự kiện có thể 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.

3 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ android performance webview , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading