2014-10-30 41 views
21

Ktoś proszę mi powiedzieć różnicę między metodami public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) i public boolean shouldOverrideUrlLoading(WebView view, String url).Różnica między ładowaniem przeładunkowym a wymogiemumysłania?

Tworzę aplikację dla systemu Android, w której ciąg znaków jest odpowiedzią zdarzenia kliknięcia w moim WebView. Chcę zapisać ten ciąg i wyświetlić go. Zobaczyłem obie te metody. Próbowałem użyć shouldOverrideUrlLoading, które zwraca adres URL przekierowania po sprawdzeniu, tworząc przykładową aplikację, używając adresu URL google.com jako adresu URL, który załadowałem w moim WebView i kliknąłem menu.

Czy ktoś mógłby mi powiedzieć, jaka jest różnica między tymi metodami, a którą należy użyć?

Odpowiedz

1

wierzę, że shouldOverrideUrlLoading jest wywoływana, gdy nowa strona jest ładowana do WebView, tak na przykład, gdy robisz początkowy:

webview.loadUrl("file:///android_asset/web/index.html");  

swojej shouldOverrideUrlLoading będzie się powoływać, a to będzie się ponownie wywoływany jeśli użytkownik kliknie link, aby przejść do nowej strony.

shouldInterceptRequest powinien zostać wywołany dla wszystkich żądań wprowadzonych w ramach bieżącej strony, np. kiedy importuję czcionki HTML widzę, że powinienem wywołać metodęInterceptRequest, lub gdy webView próbuje załadować obrazy na mojej stronie, zostaje wywołana (ale nie widzę, żeby to wywoływało żądania ajaxowe, więc wciąż jestem trochę zdezorientowana).

+0

Najwyraźniej shouldOverrideUrlLoading() nie zostanie wywołana, gdy loadUrl nazywa się po raz pierwszy. Wbrew powszechnemu przekonaniu, powinno wywołaćOverrideUrlLoading(), gdy zostanie kliknięte łącze wewnętrzne z już załadowanej strony internetowej. – AnupamChugh

23

Android realizacja WebKit pozwala programiście zmodyfikować WebView przez klasę android.webkit.WebSettings takich jak

  • obsługą JavaScriptu
  • wsparcie dla wtyczek,
  • File System Access
  • zasobów Inspection itp.

W Inspekcja zasobów, możliwe jest sprawdzenie żądań dotyczących treści i/lub zasobów przez zastąpienie metod: shouldOverrideUrlLoading i shouldInterceptRequest.

Ale przede dwóch metod jest wykorzystanie do różnych celów, takich jak

1. shouldOverrideUrlLoading jest wywoływana, gdy nowa strona ma być otwarta podczas shouldInterceptRequest nazywa każdym razem, gdy zasób jest załadowany jak plik css, js plik itp.

2.Jeśli użytkownik interaktywnie zażąda zasobu z poziomu WebView, możliwe jest zastosowanie metody shouldOverrideUrlLoading klasy WebViewClient do przechwycenia żądania. Przykładowy kod przedstawiono poniżej. Source

private class MyWebViewClient extends WebViewClient { 
    @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (Uri.parse(url).getHost().equals("www.google.com")) { 
      return true; 
     } 
     return false; 
    } 
} 

Metoda daje aplikacji hosta szansę przejąć kontrolę, gdy nowy adres URL ma być załadowany w bieżącym WebView. Zwracana wartość true oznacza, że ​​aplikacja hosta obsługuje adres URL, a return false oznacza, że ​​bieżący WebView obsługuje adres URL. Powyższy kod zapobiega ładowaniu zasobów z hosta "www.google.com".

Jednak metoda nie przechwytuje ładowania zasobów z wnętrza, na przykład z IFRAME lub atrybutu src w tagu HTML lub SCRIPT na przykład. Dodatkowo XmlHttpRequests również nie zostaną przechwycone. Aby przechwycić te żądania, możesz skorzystać z metody WebViewClient shouldInterceptRequest. Przykładowy kod przedstawiono poniżej.

@Override 
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) { 
    if (url.contains(".js")) { 
     return getWebResourceResponseFromString(); 
    } else { 
     return super.shouldInterceptRequest(view, url); 
    } 
} 
private WebResourceResponse getWebResourceResponseFromString() { 
    return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert('!NO!')")); 
} 
private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) { 
    return new WebResourceResponse("text/javascript", "UTF-8", data); 
} 

Ta metoda powiadamia aplikację hosta o żądaniu zasobu i umożliwia aplikacji zwrócenie danych. Jeśli zwrócona wartość jest pusta, WebView będzie nadal ładował zasób w zwykły sposób. W przeciwnym razie zostanie wykorzystana odpowiedź zwrotna i dane. Powyższy kod przechwytuje żądania dotyczące zasobów JavaScript (.js) i zwraca alert zamiast żądanego zasobu.

Zobacz więcej na: WebViewClient shouldOverrideUrlLoading i shouldInterceptRequest