Android वेबव्यू धीमा


174

मेरी android webviewsगति धीमी है। यह फोन से लेकर 3.0+टैबलेट तक सब कुछ पर्याप्त स्पेक्स के साथ है

मुझे पता है कि वेबव्यू "सीमित" माना जाता है, लेकिन मुझे फोन गैप के साथ किए गए वेब ऐप दिखाई देते हैं जो सभी प्रकार के CSS3और JQueryटोने- टोटके का उपयोग करना चाहिए , वे बस ठीक और तेज़ गति से चलते हैं

तो मुझे कुछ याद आ रहा है, क्या कुछ ऐसा है myWebview.SPEEDHACK(1)जो मैं चीजों को गति देने के लिए उपयोग कर सकता हूं?

भी, कभी-कभी मेरे वेबव्यू की सामग्री बस लोड नहीं करती है, धीरे-धीरे लोड करने के बजाय, यह सिर्फ लोड नहीं करेगा। मैं जिस परिसंपत्ति का परीक्षण कर रहा हूं, वह स्थानीय रूप से संग्रहीत है, कोई त्रुटि नहीं।


3
लगता है जैसे आपको कुछ कोड पोस्ट करने की आवश्यकता है।
जसोनेर


1
@KenWhite को छोड़कर इस प्रश्न के अधिक उत्तर हैं, इस प्रश्न के बेहतर और अधिक व्यापक उत्तर हैं, इस प्रश्न के दो बार कई विचार हैं, दोनों प्रश्न दो साल से अधिक पुराने हैं, इन दोनों प्रश्नों के Android के संस्करण को अप्रचलित करने के लिए लागू किया गया है ... क्या क्या आप इसे फ़्लैग करने से बाहर निकले हैं?
सीक्यूएम

@CQM: नीचे दिए गए जॉर्ज मेयस के डुप्लिकेट किए गए उत्तर के कारण यह प्रश्न सिस्टम द्वारा स्वचालित रूप से चिह्नित किया गया था। यदि उनके उत्तर को कई पदों के उत्तर के रूप में दोहराया जा सकता है, तो उनमें से एक दूसरे की नकल है। लिंक किए गए प्रश्न को पोस्ट तिथि के आधार पर पहले पोस्ट किया गया था (और उत्तर दिया गया था)। एक डुप्लिकेट एक डुप्लिकेट है, और पहली पोस्ट मूल थी (और उत्तर पहले भी थे)। मुझे इसे फ़्लैग करने से कुछ भी नहीं मिलता (और यह पहली जगह में नहीं था)।
केन व्हाइट

1
इसके अलावा, अपने एप्लिकेशन में क्लिक इवेंट का उपयोग न करें, यह एक क्लिक पर निर्धारित करने के लिए प्रत्येक क्लिक पर प्रतिक्रिया देने के लिए 300ms देरी जोड़ता है। इसके बजाय टचस्टार्ट का बेहतर उपयोग करें। मैंने एक क्लिकहैंडलर बनाया है जो दो घटनाओं का उपयोग करता है और पहला ट्रिगर इवेंट लेता है। मैं 'टचस्टार्ट क्लिक' का उपयोग करता हूं, इसलिए यह अभी भी बिना टचस्क्रीन के काम करता है।
कोडबीट

जवाबों:


132

यह वेब एप्लिकेशन लोड होने पर निर्भर करता है। नीचे दिए गए कुछ तरीकों की कोशिश करें:

उच्च रेंडर प्राथमिकता निर्धारित करें (एपीआई 18+ से हटा दिया गया):

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

हार्डवेयर त्वरण सक्षम / अक्षम करें:

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

कैश अक्षम करें (यदि आपको अपनी सामग्री की समस्या है):

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

46
मैं समझता हूं कि रेंडर को प्राथमिकता देने के लिए इसे उच्च क्यों बनाया जाएगा। लेकिन कैश को बंद करना क्यों?
डिमास कोटवन

39
विधि setRederPriority को हटा दिया गया है, डेवलपर
विक्टर Ionescu

6
सेटरेंडरपैरिटी के लिए सही लिंक यहाँ है
क्रिस्टोफर पेरी

2
इस कोड को मैं अपने ऐप में कहां डालूं? कृपया मदद करें - मुझे मिशन क्रिटिकल वेबव्यू पर एक ही समस्या है
Levchik

6
आप कैश बंद क्यों करते हैं?
हसी 31

52

android:hardwareAccelerated="true"घोषणापत्र में इसे जोड़ना एकमात्र ऐसी चीज थी जिसने मेरे लिए प्रदर्शन में काफी सुधार किया

अधिक जानकारी यहाँ: http://developer.android.com/guide/topics/manifest/application-element.html#hacaccel


1
यह केवल एपीआई v11 / एंड्रॉइड 3.x और उच्चतर के लिए है
लुडवो

6
ध्यान रखें, एक खुला बग संबंधित हार्डवेयर त्वरित वेब व्यू है, जैसा कि प्रश्न में कहा गया है stackoverflow.com/q/17059899/225341
विक्टर Ionescu

1
मैंने देखा है कि हार्डवेयर त्वरण को बंद करना वास्तव में मेरे ऐप को तेज़ बनाता है। android:hardwareAccelerated="true"सीएसएस 3 डी एनिमेशन के साथ शुरू होने से पहले लंबे समय से देरी हो रही थी, अन्य स्क्रॉल करने योग्य डीआईवी के अंदर डीआईवाई की स्क्रॉलिंग काम नहीं करती थी, और ऐप अधिक अस्थिर था।
एर्नेस्ट कार्लसन

1
डिफ़ॉल्ट मान "सत्य" है यदि आपने या तो minSdkVersion या targetSdkVersion को "14" या उच्चतर पर सेट किया है;
विहान वर्मा

37

हमारे लिए समाधान इसके विपरीत था। हमने इस कोड का उपयोग करके केवल WebView पर हार्डवेयर त्वरण (प्रकट में संपूर्ण ऐप पर) के बजाय अक्षम किया है:

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

CSS3 एनिमेशन अब चिकनी हैं। हम एंड्रॉइड 4.0 का उपयोग कर रहे हैं।

यहां अधिक जानकारी: https://code.google.com/p/android/issues/detail?id=17352


4
दुर्भाग्य से, यह html5 वीडियो घटक को काम करने के लिए रोकता है = /
Ja Aprck

ध्यान नहीं दिया। हमने वीडियो चलाने के लिए एक वीडियो दृश्य का उपयोग किया: सौभाग्य से हमें बस एक पूर्ण स्क्रीन वीडियो की आवश्यकता थी। वर्कअराउंड के रूप में यह संभव है कि वेबव्यू पारदर्शी हो और बैकग्राउंड में एक वीडियो दृश्य चल रहा हो, हालाँकि मुझे पता है कि यह एक ही बात नहीं है।
Ena

1
इस फिक्स के साथ एक और समस्या है। वेबव्यू को छूने के दौरान ग्राफिक थोड़ा परेशान हो जाता है। उदाहरण के लिए यदि आपके पास एक क्रिल के साथ एक छवि है, तो आप चिकनी रेखा के बजाय उस पर छोटे वर्गों (पिक्सेल) को देखेंगे। मैं बता सकता हूं कि एंड्रॉइड 4.3 फिक्स के साथ बेकार है, इसमें प्रदर्शन समस्याएं नहीं हैं।
Ena

क्षमा करें, Android के लिए थोड़ा नया है। क्या यह सीधे Android मेनिफ़ेस्ट हो रहा है कि मेनिफ़ेस्ट फ़ाइल XML है। या इसे वेबवार्ता को लोड करते समय स्रोत कोड में मान्य किया जाना चाहिए। नॉब प्रश्न के लिए क्षमा करें।
15 मई को 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
डेवलपर

14

मुझे लगता है कि निम्नलिखित कार्य सर्वोत्तम हैं:

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 के लिए क्रोमियम इंजन है। मुझे लगता है कि यह हार्डवेयर त्वरण के साथ बेहतर काम करता है।


1
इस गरीब एनिमेशन और स्क्रॉल के साथ WebViews पर मेरे लिए काम किया
कैलोरी

क्या यह मैं हूं या आपका 'और ’आपके? अगर’ की तरह ही करता है?
कोडबीट

एरविनस एक टाइप_ओएसटीवेयर के लिए है और दूसरा हार्डवेयर
यूजर 2582318

9

मेरे पास यही मुद्दा था और मुझे इसे पूरा करना था। मैंने इन समाधानों की कोशिश की, लेकिन प्रदर्शन के अंत में, कम से कम स्क्रॉलिंग के लिए बिल्कुल भी सुधार नहीं हुआ। तो यहाँ पर जो वर्कआॅर्ड मैंने किया था और जो मेरे लिए काम करता था उसकी व्याख्या।

यदि आपको "MiWebView" क्लास बनाकर, ड्रैग ईवेंट्स का पता लगाने का मौका मिला, तो "onTouchEvent" मेथड को ओवरराइट करके और कम से कम हर ड्रैग इवेंट के समय को प्रिंट करके, आप देखेंगे कि वे अलग हो गए हैं समय के लिए (नीचे) 9ms दूर। घटनाओं के बीच वह बहुत कम समय है।

WebView Source Code पर एक नज़र डालें , और केवल onTouchEvent फ़ंक्शन देखें। प्रोसेसर को 9ms से कम में संभालना असंभव है (सपने देखना जारी रखें !!!)। इसलिए आप लगातार "मिस अ ड्रैग को देखते हैं क्योंकि हम वेबकोर के टच डाउन के जवाब का इंतजार कर रहे हैं।" संदेश। कोड को समय पर नियंत्रित नहीं किया जा सकता है।

इसे कैसे जोड़ेंगे? सबसे पहले, आप इसे सुधारने के लिए onTouchEvent कोड को फिर से नहीं लिख सकते हैं, यह बहुत अधिक है। लेकिन, आप आंदोलनों को खींचने के लिए घटना की दर को सीमित करने के लिए इसे "नकली" कर सकते हैं, जो कि 40ms या 50ms को कहते हैं। (यह प्रोसेसर पर निर्भर करता है)।

सभी स्पर्श इवेंट इस तरह से चलते हैं: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_MOVE। इसलिए हमें DOWN और UP आंदोलनों को बनाए रखने और MOVE दर (ये बुरे लोग हैं) को फ़िल्टर करने की आवश्यकता है।

और यहाँ ऐसा करने का एक तरीका है (आप 2 उंगलियों के स्पर्श की तरह अधिक ईवेंट प्रकार जोड़ सकते हैं, सभी मुझे यहाँ रुचि रखते हैं एकल उंगली स्क्रॉलिंग है)।

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

बेशक WebView के बजाय इस वर्ग का उपयोग करें और स्क्रॉल करते समय आपको अंतर दिखाई देगा।

यह सिर्फ एक समाधान के लिए एक दृष्टिकोण है, फिर भी WebView का उपयोग करते समय स्क्रीन को छूने के कारण सभी अंतराल मामलों के लिए पूरी तरह से लागू नहीं किया गया है। हालांकि यह सबसे अच्छा समाधान है जो मैंने पाया है, कम से कम मेरी विशिष्ट आवश्यकताओं के लिए।


मैं यह बताना चाहता हूं कि आपके द्वारा पोस्ट किया गया वेबव्यू सोर्स कोड 2010 से है
CQM

यह काम नहीं करता है, यह स्क्रॉलिंग को सुचारू नहीं करता है, मैं अंतर महसूस नहीं कर सकता।
नीवेक

मैंने इस सेटिंग को 80 तक सीमित कर दिया है, लेकिन यह वास्तव में प्रदर्शन में सुधार नहीं करता है, लेकिन यह कुछ चाल घटनाओं को पकड़ता है। यह आपके लिए क्या करता है?
राग्नार

पढ़ा है कि एक क्लिक ईवेंट 6 गुना धीमा है जो ईवेंट टचस्टार्ट को स्पर्श करता है। देरी से बचने के लिए आप $ ('# बटन') का उपयोग कर सकते हैं। ('' टचस्टार्ट क्लिक '', फंक्शन () {क्रिया यहाँ; वापसी झूठ;});
कोडबीट

इसके अलावा, अपने HTML एप्लिकेशन में क्लिक इवेंट का उपयोग न करें, यह एक क्लिक पर निर्धारित करने के लिए प्रत्येक क्लिक पर प्रतिक्रिया करने के लिए 300ms देरी जोड़ता है। इसके बजाय टचस्टार्ट का बेहतर उपयोग करें। मैंने एक क्लिकहैंडलर बनाया है जो दो घटनाओं का उपयोग करता है और पहला ट्रिगर इवेंट लेता है। मैं 'टचस्टार्ट क्लिक' का उपयोग करता हूं, इसलिए यह अभी भी बिना टचस्क्रीन के काम करता है।
कोडबीट

9

मैंने अपने फोनगैप ऐप में रेंडर प्रदर्शन समस्या को ठीक करने के लिए सभी प्रस्तावों की कोशिश की। लेकिन वास्तव में कुछ भी काम नहीं किया।

आखिरकार, पूरे दिन की खोज के बाद, मैंने इसे बनाया। मैंने अपने AndroidManifest के टैग (टैग नहीं) के भीतर सेट किया

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

अब ऐप उसी तेजी से व्यवहार करता है जैसे मेरे वेबब्रोसर। लगता है, अगर हार्डवेयर त्वरण हमेशा सबसे अच्छी सुविधा नहीं है ...

विस्तृत समस्या मेरे पास थी: https://stackoverflow.com/a/24467920/3595386


2
हार्डवेयर त्वरण को निष्क्रिय करना मेरे लिए भयानक था, वेब स्क्रॉलिंग में इतना धीमा था
अब्देलहैडी

5

उन जवाबों में से कोई भी मेरे लिए उपयोगी नहीं था।

अंत में मुझे कारण और समाधान मिल गया है। इसका कारण बहुत सारे CSS3 फ़िल्टर (फ़िल्टर, -webkit-filter) थे।

उपाय

मैंने HTML बॉडी में वर्ग "न्यूनता" जोड़ने के लिए वेब पेज स्क्रिप्ट में WebView का पता लगाया है। Btw। आप WebView सेटिंग्स में उपयोगकर्ता-एजेंट को सेट करके आसानी से WebView को ट्रैक कर सकते हैं। फिर मैंने नया CSS नियम बनाया

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

अजीब बात है जब 5 साल बाद उपकरणों के तेज होने के बावजूद वेबव्यू का उपयोग करने के बहुत कम कारण हैं, तो अधिक मोबाइल ब्राउज़र संगत प्रदर्शन में बहुत सुधार हुआ है और अन्य कारण हैं। हालांकि यह देखने के लिए धन्यवाद!
CQM

@ सीक्यूएम मुझे एक ही समस्या थी, मुझे समाधान मिला तो मैं इसे साझा करना चाहता था :)
l00k

मैं सिर्फ मुखर हो रहा हूं, यह मेरे सबसे पुराने प्रश्नों में से एक है, फिर से धन्यवाद!
CQM

1
यह बेतुका है कि यह 2016/2017 में एक मुद्दा है। कोई भी सीएसएस फिल्टर किसी भी मोबाइल GPU के लिए चुनौतीपूर्ण नहीं होना चाहिए।
एडम लेगट

4

यदि आपके वेबव्यू के कुछ ही घटक हैं जो धीमे या सुस्त हैं, तो इसे तत्व css में जोड़ने का प्रयास करें:

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

यह एकमात्र गति है जो वास्तव में मेरे वेबव्यू पर प्रभाव डालती है। लेकिन इसका अत्यधिक उपयोग न करें! (आप इस लेख में हैक के बारे में अधिक पढ़ सकते हैं ।)


1
का उपयोग करें will-change: transform
एडम लेगट


3

यदि आप onclickघटना के लिए बाध्य हैं , तो यह टच स्क्रीन पर धीमा हो सकता है।

इसे तेज करने के लिए, मैं फास्टक्लिक का उपयोग करता हूं , जो क्लिक इवेंट की नकल करने के लिए बहुत तेज स्पर्श घटनाओं का उपयोग करता है।


fastclick का अब विकास नहीं हो रहा है ... हाँ स्पर्श की घटनाएं धीमी हैं और मुझे बस काम करने की ज़रूरत है और jquery के साथ गति के मुद्दे को पाया जा सकता है $('#').on('touchstart', function() {...});
जिसे ऑन्कलिक के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.