概要
webviewの通信エラーを通知してくれる、WebViewClient
の [onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String)](https://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String)) がAPI level 23 から deprecatedになりました。
代わりに [onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)](https://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError)) が用意されたのですが、これを使うときの注意点のまとめメモです。
注意点
onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)
のドキュメントを見てみるとこんな記載になっています
Report web resource loading error to the host application. These errors usually indicate inability to connect to the server. Note that unlike the deprecated version of the callback, the new version will be called for any resource (iframe, image, etc), not just for the main page. Thus, it is recommended to perform minimum required work in this callback.
以前とは違ってiframeのエラーだったり、画像が取得できなかったりした場合もこのコールバックが呼ばれるようになってしまいました。
そのため、onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String)
が呼ばれたらエラー表示をするような使い方をしている場合、同じことをonReceivedError(WebView view, WebResourceRequest request, WebResourceError error)
でそのまま実行すると、リンク切れ画像があるようなページを表示する際にエラーになってしまいます。
解決策
onReceivedError(android.webkit.WebView, int, java.lang.String, java.lang.String)
と同じような使い方をしたい場合は以下のようにします。
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
if (request.isForMainFrame()) {
// エラー処理を実行
}
}
WebResourceRequest.html#isForMainFrame() を使ってメインページのリクエストに対してだけエラー処理を実行するようにします。