Czy „shouldOverrideUrlLoading” jest naprawdę przestarzały? Jeśli tak, czego mogę użyć zamiast tego?
Wygląda na to, że shouldOverrideUrlLoading
jest przestarzała dla systemu Android N i muszę sprawić, by aplikacja działała od API 19 do najnowszego, czyli Android N (beta). Używam niektórych funkcji, które są nowe w Androidzie N (np. Oszczędzanie danych), więc celowanie Marshmallow nie pomoże w rozwiązaniu problemu, ponieważ muszę użyć tych nowych funkcji, oto część kodu, którego używam:
public boolean shouldOverrideUrlLoading(WebView webview, String url) {
if (url.startsWith("http:") || url.startsWith("https:")) {
...
} else if (url.startsWith("sms:")) {
...
}
...
}
A oto wiadomość, którą przekazał mi Android Studio:
Zastępuje przestarzałą metodę w „android.webkit.WebViewClient”. Ta inspekcja zgłasza przypadki użycia przestarzałego kodu w określonym zakresie inspekcji.
Google nic nie mówi o tym wycofaniu .
Zastanawiam się, czy używanie @SuppressWarnings("deprecation")
pozwoli mi pracować na wszystkich urządzeniach od API 19 do najnowszego Androida N Beta (i jego ostatecznej wersji po premierze), sam nie mogę tego przetestować, nigdy tego nie używałem i muszę mieć pewność że to działa, więc każdy może powiedzieć?
Odpowiedzi:
Nie, nie jest.
Ten, który jest nowy w N Developer Preview, ma następującą sygnaturę metody:
Ten, który jest obsługiwany przez wszystkie wersje Androida, w tym N, ma następujący podpis metody:
Zastąp przestarzały parametr, który przyjmuje
String
jako drugi parametr.źródło
String
. Na przykład ta przykładowa aplikacja , skompilowana na poziomie API 19, działa dobrze, na przykład na Nexusie 5 z systemem Android 6.0String
jako drugi parametr. Na przykład przykładowa aplikacja, z którągetUrl()
ponieważ nowa metoda będzie wywoływana tylko dla 24+Szczegółowa dokumentacja dla przyszłych czytelników:
Krótka odpowiedź brzmi: musisz zastąpić obie metody. Ta
shouldOverrideUrlLoading(WebView view, String url)
metoda jest przestarzała w API 24, ashouldOverrideUrlLoading(WebView view, WebResourceRequest request)
metoda została dodana w API 24. Jeśli kierujesz na starsze wersje Androida, potrzebujesz poprzedniej metody, a jeśli celujesz w 24 (lub nowszą, jeśli ktoś czyta to w odległej przyszłości) wskazane jest również zastąpienie tej drugiej metody.Poniżej znajduje się szkielet tego, jak możesz to osiągnąć:
Podobnie
shouldOverrideUrlLoading
możesz wymyślić podobne podejście doshouldInterceptRequest
metody.źródło
@RequiresApi
tutaj zamiast @TargetApi do użytku w przyszłościshouldInterceptRequest
, polega na tym, że na urządzeniach z Androidem N + obie są wywoływane i będziesz obsługiwać każdy uri dwa razy! Aby temu zaradzić, dodałemBuild.VERSION.SDK_INT < Build.VERSION_CODES.N
warunek w wycofanej wersji.super. shouldOverrideUrlLoading(view,request)
metodę, która nie jest przestarzała, to tak, zostanie wywołana zarówno metoda, która nie jest przestarzała, jak i ta, która nie jest przestarzała. Dzieje się tak, ponieważ domyślną implementacją metody, która nie jest przestarzała, jest wewnętrzne wywołanie metody, która nie jest przestarzała. Wystarczy spojrzeć na plikWebViewClient.shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
. Więc upewnij się, że nie dzwoniszsuper.shouldOverrideUrlLoading()
.Posługiwać się
źródło
Zaimplementuj zarówno przestarzałe, jak i nie wycofane metody, jak poniżej. Pierwszy z nich to obsługa interfejsu API na poziomie 21 i wyższym, a drugi na poziomie niższym niż poziom API 21
źródło
Uri.parse
iparseUri
. Nowe odpowiedzi powinny dostarczyć nowych przydatnych informacji i nowych spostrzeżeń na ten temat.