Android web görünümü yavaş


174

Benim android webviewsyavaşım. Bu, telefonlardan 3.0+tabletlere, yeterli özelliklerden daha fazlasını içeren her şeyde

Web görüntülemelerinin "sınırlı" olması gerektiğini biliyorum, ancak her türlü CSS3ve JQuerybüyücülük kullanması gereken telefon boşluğu ile yapılan web uygulamalarını görüyorum , sadece iyi ve hızlı çalışıyorlar

yani bir şey eksik, myWebview.SPEEDHACK(1)işleri hızlandırmak için kullanabileceğim bir tür var mı?

Ayrıca, bazen web görünümümün içeriği sadece yüklemez, yavaşça yüklemek yerine, sadece yüklemez. Test ettiğim varlık yerel olarak saklanıyor, hata yok.


3
Bazı kodlar göndermeniz gerekiyor gibi görünüyor.
Jasoneer


1
@KenWhite dışında bu sorunun daha fazla cevabı var, bu sorunun daha iyi ve daha kapsamlı cevapları var, bu soruların iki kat daha fazla görünümü var, her iki soru da iki yaşın üzerindedir, android sürümünde uygulanan bu soruların her ikisi de eski ... ne tam olarak bunu işaretlemekten kurtuluyor musun?
CQM

@CQM: Bu soru, aşağıdaki George Mays'ın yinelenen cevabı nedeniyle sistem tarafından otomatik olarak işaretlendi. Cevabı birden fazla gönderinin yanıtı olarak aynen tekrarlanabilirse, bunlardan biri diğerinin kopyasıdır. Bağlantılı soru ilk olarak gönderi tarihine göre yayınlandı (ve cevaplandı). Yinelenen yinelenen bir kopyadır ve ilk gönderi orijinaldir (ve yanıtlar da daha önceydi). Bu işaretleme dışında hiçbir şey almak (ve ilk etapta yoktu).
Ken White

1
Ayrıca, uygulamalarınızdaki tıklama etkinliğini kullanmayın, her tıklamaya yanıt vermek için bir tıklama olduğunu belirlemek üzere 300 ms gecikme ekler. Bunun yerine touchstart'ı daha iyi kullanın. İki olayı kullanan ve ilk tetiklenen olayı alan bir tıklama işleyicisi yaptım. 'Touchstart click' kullanıyorum, bu yüzden hala dokunmatik ekran olmadan da çalışıyor.
Codebeat

Yanıtlar:


132

Yüklenen web uygulamasına bağlıdır. Aşağıdaki yaklaşımlardan bazılarını deneyin:

Daha yüksek oluşturma önceliği belirleyin (API 18+'den kaldırılmıştır):

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

Donanım hızlandırmayı etkinleştirme / devre dışı bırakma:

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

Önbelleği devre dışı bırakın (içeriğinizle ilgili sorun yaşıyorsanız):

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

46
Görüntü oluşturma önceliğini yüksek değere ayarlamanın neden daha hızlı olacağını anlıyorum. ama neden önbelleği kapatalım?
Dimas Kotvan

39
SetRederPriority yöntemi kullanımdan kaldırıldı, bkz. Developer.android.com/reference/android/webkit/WebSettings.html
Victor Ionescu

6
SetRenderPriority için doğru bağlantı burada
Christopher Perry

2
Bu kodu Uygulamama nereye koyabilirim? Lütfen yardım - Ben kritik kritik görev WebView aynı sorun var
Levchik

6
neden önbelleği kapatıyorsun?
23:16

52

Bunu android:hardwareAccelerated="true"manifest'e eklemek , performansı benim için önemli ölçüde artıran tek şeydi

Daha fazla bilgi burada: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel


1
Bu sadece API v11 / Android 3.x ve üstü için
Ludwo


1
Donanım hızlandırmayı kapatmanın aslında uygulamamı daha hızlı hale getirdiğini fark ettim. İle android:hardwareAccelerated="true"onlar başlamadan önce CSS 3D animasyonlar, uzun gecikmelere vardı diğer kaydırılabilir DIV'leri işi yoktu içeride DIV öğeleri arasında kaydırma ve uygulama daha istikrarsız oldu.
Ernests Karlsons

1
minSdkVersion veya targetSdkVersion'ı "14" veya daha yüksek bir değere ayarlarsanız varsayılan değer "true" olur;
Vihaan Verma

37

Bizim için çözüm tam tersiydi. Bu kodu kullanarak donanım hızlandırmayı yalnızca WebView'da (manifest'teki tüm uygulama yerine) devre dışı bıraktık:

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

CSS3 animasyonları artık daha akıcı. Android 4.0 kullanıyoruz.

Daha fazla bilgi burada: https://code.google.com/p/android/issues/detail?id=17352


4
Ne yazık ki, bu aynı zamanda html5 video bileşeninin çalışmasını önler = /
Ja͢ck

Fark etmedim. Videoları oynatmak için bir video görünümü kullandık: Neyse ki tam ekran bir videoya ihtiyacımız vardı. Geçici bir çözüm olarak, bunun aynı şey olmadığını bilsem de, web görünümünün saydam ve videonun arka planda oynatılması mümkündür.
Ena

1
Bu düzeltmeyle ilgili başka bir sorun daha var. Web görünümüne dokunurken grafik biraz bozulur. Örneğin, çemberli bir görüntünüz varsa, üzerinde düz çizgi yerine küçük kareler (piksel) göreceksiniz. Android 4.3 düzeltmesi ile işe yaramaz olduğunu, performans sorunları olmadığını söyleyebilirim.
Ena

Üzgünüm android için biraz yeni. Bu doğrudan manifest dosyasında XML olduğunu varlık manifest dosyaya katlanabilir mi. Yoksa, web görünümü yüklenirken kaynak kodunda doğrulanması gerekiyor. Çaylak sorusu için üzgünüm.
xMythicx

1
WebView not displayed because it is too large to fit into a software layer (or drawing cache), needs 11534400 bytes, only 8294400 available
developer1011

14

Bence aşağıdakiler en iyi sonucu verir:

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, WebView için Chromium motoruna sahiptir. Sanırım donanım hızlandırma ile daha iyi çalışıyor.


1
Bu benim için kötü animasyonlar ve kaydırma ile WebViews üzerinde çalıştı
cal

Benim mi yoksa 'başkası' senin 'if' ile aynı mı?
Codebeat

Erwinus biri type_SOFTWARE ve diğer Donanım içindir
user2582318

9

Aynı sorunu yaşıyordum ve çözmek zorunda kaldım. Bu çözümleri denedim, ancak sonunda performans, en azından kaydırma için hiç iyileşmedi. Burada yaptığım geçici çözüm ve bunun benim için neden işe yaradığının açıklaması.

Bir "MiWebView" Sınıfı oluşturarak, "onTouchEvent" yönteminin üzerine yazarak ve en azından her sürükleme olayının gerçekleştiği zamanı yazdırarak sürükleme olaylarını keşfetme şansınız varsa, bunların ayrıldığını göreceksiniz 9ms uzakta (aşağı) kadar zamanında. Olaylar arasında çok kısa bir zaman.

WebView Kaynak Koduna bir göz atın ve sadece onTouchEvent işlevine bakın. İşlemci tarafından 9 ms'den daha az bir sürede ele alınması imkansızdır (Hayal kurmaya devam edin !!!). Bu yüzden sürekli "WebCore'un temasa yanıtını beklerken bir özledim özledim" görüyorsunuz. İleti. Kod zamanında işlenemez.

Nasıl düzeltebilirim? İlk olarak, iyileştirmek için onTouchEvent kodunu yeniden yazamazsınız, çok fazladır. Ancak, sürükleme hareketleri için olay hızını 40ms veya 50ms olarak sınırlamak için "alay edebilirsiniz". (bu işlemciye bağlıdır).

Tüm dokunma etkinlikleri şu şekildedir: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Bu yüzden AŞAĞI ve YUKARI hareketlerini korumamız ve MOVE oranını filtrelememiz gerekiyor (bunlar kötü adamlar).

Ve işte bunu yapmanın bir yolu (2 parmak dokunuşu gibi daha fazla olay türü ekleyebilirsiniz, burada ilgilendiğim tek şey tek parmak kaydırma).

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

Tabii ki WebView yerine bu sınıfı kullanın ve kaydırma yaparken farkı göreceksiniz.

Bu sadece bir çözüme bir yaklaşımdır, ancak WebView kullanırken ekrana dokunma nedeniyle tüm gecikme durumları için tam olarak uygulanmamıştır. Ancak, en azından özel ihtiyaçlarım için bulduğum en iyi çözüm.


Gönderdiğiniz web görünümü kaynak kodunun 2010
CQM

Bu çalışmıyor, düzgün kaydırma yapmıyor, farkı hissedemiyorum.
neevek

Bu ayarı 80'e kadar sınırlandırdım, ancak aslında performansı iyileştirmiyor gibi görünüyor, ancak bazı hareket olaylarını yakalıyor. Sizin için ne yapar?
Ragnar

Bir tıklama etkinliğinin dokunma etkinliğinin dokunmatik başlatmaya göre 6 kat daha yavaş olduğunu okuyun. Gecikmeleri önlemek için $ ('# düğmesi') kullanın.
Mart'ta Codebeat

Ayrıca, html uygulamalarınızda tıklama etkinliğini kullanmayın, her tıklamada yanıt vermek için 300ms gecikme ekler, bunun bir tıklama olduğunu belirler. Bunun yerine touchstart'ı daha iyi kullanın. İki olayı kullanan ve ilk tetiklenen olayı alan bir tıklama işleyicisi yaptım. 'Touchstart click' kullanıyorum, bu yüzden hala dokunmatik ekran olmadan çalışıyor.
Codebeat

9

Phonegap uygulamamdaki render performansı sorununu gidermek için tüm önerileri denedim. Ama hiçbir şey gerçekten işe yaramadı.

Sonunda, bütün bir arama gününden sonra başardım. AndroidManifest'imin etiketinde (etiketinde değil) ayarladım

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

Şimdi uygulama benim webbrowser ile aynı hızlı şekilde davranır. Donanım hızlandırma her zaman en iyi özellik değilse ...

Sahip olduğum ayrıntılı sorun: https://stackoverflow.com/a/24467920/3595386


2
Donanım hızlandırmasını devre dışı bırakmak benim için korkunçtu, web görünümü kaydırmada çok yavaştı
AbdelHady

5

Bu cevapların hiçbiri bana yardımcı olmadı.

Sonunda neden ve çözüm buldum. Nedeni çok fazla CSS3 filtresiydi (filtre, -webkit-filtre).

Çözüm

HTML gövdesine sınıf "düşük kalite" eklemek için web sayfası komut dosyasında WebView algılama ekledim. BTW. WebView ayarlarında kullanıcı aracısını ayarlayarak WebView'ı kolayca izleyebilirsiniz. Sonra yeni CSS kuralı oluşturdum

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

5 yıl sonra cihazların daha hızlı olmasına rağmen web görünümünü kullanmanın çok az nedeni olduğunda, daha mobil tarayıcı uyumlu performansın büyük ölçüde iyileştiğini ve diğer nedenleri garip olduğunda. Yine de baktığınız için teşekkürler!
CQM

@CQM Aynı sorunu yaşadım, çözüm buldum, bu yüzden paylaşmak istedim :)
l00k

Sadece müstehcenim, bu en eski sorularımdan biri, tekrar teşekkürler!
CQM

1
Bunun 2016/2017 yıllarında bir sorun olması saçmadır. CSS filtrelerinin hiçbiri herhangi bir mobil GPU için zor olmamalıdır.
Adam Leggett

4

Web görünümünüzün yavaş veya gecikmeli olan yalnızca birkaç bileşeni varsa, bunu css öğelerine eklemeyi deneyin:

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

Bu, web görünümüm üzerinde gerçekten etkisi olan tek speedhack oldu. Ancak aşırı kullanmamaya dikkat edin! (hack hakkında daha fazla bilgiyi bu makalede okuyabilirsiniz .)


1
Kullanın will-change: transform.
Adam Leggett


3

Eğer bağlanma ise onclickolay, bu dokunmatik ekranlarda yavaş olabilir.

Daha hızlı hale getirmek için , tıklama olayını taklit etmek için çok daha hızlı dokunma olaylarını kullanan fastclick'i kullanıyorum.


fastclick artık geliştirilmiyor ... evet dokunma olayları yavaş ve ben sadece çalışması gerekiyordu ve jquery ile bulundu hız sorunu $('#').on('touchstart', function() {...});onclick yerine kullanarak çalışabilir
CrandellWS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.