2015-02-07 9 views
9

का उपयोग करते समय यूआरएल के सफल लोड की जांच कैसे करें वेबव्यू एंड्रॉइड में मैं एक यूआरएल लोड करने की कोशिश कर रहा हूं और यह जांचने के लिए कि इस यूआरएल का भार सफलतापूर्वक किया गया है (इंटरनेट कनेक्शन उपलब्ध था, सर्वर ऊपर था) मैं इस धारणा के तहत था कि webview.loadUrl अपवाद फेंक देगा, लेकिन गलत! क्योंकि यह स्पष्ट रूप से here में कहा गया है "एक अपवाद नहीं फेंक दिया जाएगा"।एंड्रॉइड: webview.loadUrl

तो मैं यह देखने के लिए कैसे जांच सकता हूं कि webview.loadUrl विफल नहीं हुआ है या नहीं?

+0

क्या आप उत्तर को स्वीकार कर सकते हैं यदि यह आपकी समस्या का समाधान करने में मदद करता है। धन्यवाद –

+0

@manishkumar निश्चित रूप से, कृपया मुझे परीक्षण करने के लिए समय दें –

उत्तर

-1

आप देख सकते हैं एक यूआरएल onProgressChanged()

mWebView.setWebChromeClient(new WebChromeClient() { 

     public void onProgressChanged(WebView view, int progress) { 
       progressBar.setProgress(progress); 
       if (progress == 100) { 
        //your url is loaded successfully 
       } 
      } 
    }); 
+0

क्या यह अभ्यास में काम करता है? क्या आपने इसका परीक्षण किया है? –

+0

** यह काम नहीं करता **, प्रगति 100 तक पहुंच जाएगी, भले ही यह लोड होने में विफल हो। @ मिखाइल नागानोव का जवाब शायद सबसे अच्छा है। – JonasCz

+0

@ जोनासज़, सहमत, लेकिन मेरे ज्ञान के अनुसार, जब वेबव्यू एक यूआरएल लोड करता है और यदि वेबपृष्ठ लोड होने में विफल रहता है, तो यह सीधे 100 तक आता है, इसलिए हम कोड को संशोधित कर सकते हैं, जैसे कि (प्रगति == 99), आप क्या करते हैं कहते हैं? –

2
public class AppWebViewClient extends WebViewClient { 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      // TODO Auto-generated method stub 
      super.onPageStarted(view, url, favicon); 
      setProgressBar(true); 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      //Page load finished 
      super.onPageFinished(view, url); 
      setProgressBar(false); 
     } 
} 

का उपयोग करके सफलतापूर्वक लोड किया जाता है और फिर आप क्या कर सकते हैं

webView.setWebViewClient(new AppWebViewClient()); 

त्रुटि भाग के लिए आप onReceivedError विधि ओवरराइड कर सकते हैं

@Override 
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     // TODO Auto-generated method stub 
     super.onReceivedError(view, errorCode, description, failingUrl); 
} 
+0

पर क्या होनी चाहिए इसके लिए आयात करें? –

+0

यह काम नहीं कर रहा है! –

12

दुर्भाग्यवश, वर्तमान में यह सुनिश्चित करने के लिए वेबव्यू में कोई आसान तरीका नहीं है कि पृष्ठ पर सबकुछ सफलतापूर्वक लोड हो गया है। हम भविष्य में संस्करण में आने के लिए एक बेहतर एपीआई की उम्मीद कर रहे हैं। मुझे बताएं कि अब आप क्या कर सकते हैं।

सबसे पहले, वेबव्यू को आपके मुख्य पृष्ठ (जैसे खराब डोमेन नाम, आई/ओ त्रुटि इत्यादि) लोड करने के लिए सर्वर से कनेक्शन बनाने से रोकने वाली किसी भी समस्या का पता लगाने के लिए, आपको WebViewClient.onReceivedError कॉलबैक का उपयोग करना चाहिए अन्य लोगों को सही ढंग से सुझाव देते हैं:

public class MyWebViewClient extends WebViewClient { 
    @Override 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     // Make a note about the failed load. 
    } 
} 
myWebView.setWebViewClient(new MyWebViewClient()); 

तो सर्वर कनेक्शन सफल रहा था, और मुख्य पृष्ठ पर लिया गया और पार्स किया गया था, आप, WebView.onPageFinished कॉलबैक प्राप्त होगा तो आप भी अपने WebViewClient उपवर्ग में यह करने की जरूरत है:

public class MyWebViewClient extends WebViewClient { 
    ... 
    @Override 
    public void onPageFinished(WebView view, String url) { 
     // Make a note that the page has finished loading. 
    } 
    ... 
} 

यहां चेतावनी यह है कि यदि आपको सर्वर से HTTP त्रुटि मिली है (उदा। एक 404 या 500 त्रुटि), इस कॉलबैक को वैसे भी बुलाया जाएगा, यह केवल वही सामग्री है जिसे आप अपने वेब व्यू में प्राप्त करेंगे, एक सर्वर त्रुटि पृष्ठ होगा। लोग इसका निपटारा करने के तरीके के विभिन्न तरीकों का सुझाव देते हैं, यहां दिए गए उत्तरों को देखें: How can I check from Android WebView if a page is a "404 page not found"? असल में, यह वास्तव में उस पर निर्भर करता है कि आप "अच्छा" पृष्ठ और "त्रुटि" पृष्ठ होने की अपेक्षा करते हैं। दुर्भाग्यवश, ऐप के लिए WebView से HTTP प्रतिक्रिया कोड प्राप्त करने का कोई तरीका नहीं है।

कॉलबैक WebViewClient.onPageStarted और WebViewClient.onProgressChanged केवल तभी उपयोगी होते हैं जब आप पृष्ठ लोड कर रहे हों तो प्रगति पट्टी बनाना चाहते हैं।

भी ध्यान रखें कि है कि लोगों को आम तौर पर सुझाव है अधिभावी WebViewClient.shouldOverrideUrlLoading के रास्ते सही नहीं है:

public class MyWebViewClient extends WebViewClient { 
    ... 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url)   { 
     // !!! DO NOT DO THIS UNCONDITIONALLY !!! 
     view.loadUrl(url); 
     return true; 
    } 
    ... 
} 

क्या कुछ डेवलपर्स का एहसास है कि कॉलबैक भी गैर https योजनाओं के साथ subframes के लिए कहा जाता है। यदि आपको <iframe src='tel:1234'> जैसे कुछ सामना करना पड़ेगा, तो आप view.loadUrl('tel:1234') निष्पादित कर देंगे और आपका ऐप एक त्रुटि पृष्ठ दिखाएगा, क्योंकि WebView को tel: URL लोड करने का तरीका नहीं पता है। यह सिर्फ प्रणाली से झूठी वापस जाने के लिए सिफारिश की है, यदि आप WebView लोड हो रहा है क्या करना चाहते हैं:

public class MyWebViewClient extends WebViewClient { 
    ... 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url)   { 
     // Returning 'false' unconditionally is fine. 
     return false; 
    } 
    ... 
} 

इसका मतलब यह नहीं आप बिल्कुल shouldOverrideUrlLoading से WebView.loadUrl नहीं बुलाना चाहिए। बचने के लिए विशिष्ट पैटर्न सभी यूआरएल के लिए बिना शर्त शर्त कर रहा है।

+0

'onRecievedError()' में आप जांच सकते हैं कि असफल यूआरएल आपके द्वारा वेबव्यू में लोड किए गए मूल यूआरएल के बराबर है और पता लगाएं कि मुख्य दस्तावेज़ लोड नहीं हुआ है या नहीं। – JonasCz

+0

ज़रूर! 'ऑनपेज फिनिश' और अन्य कॉलबैक के लिए भी यही है। –

+0

onReceivedError को नहीं कहा जा रहा है। लक्ष्य API स्तर <23 है, इसलिए मैं गैर-बहिष्कृत संस्करण का उपयोग नहीं कर सकता। – Michael

संबंधित मुद्दे