[deprecated] Android WebViewClient의 onReceivedError 메서드 대응
onReceivedError 메서드는 Android WebViewClient 에서 페이지 로드 중 오류가 발생했을 때 호출되는 콜백 메서드입니다.
이 메서드는 WebView가 네트워크 오류나 기타 이유로 리소스를 가져오는 데 실패했을 때 사용자가 이를 처리할 수 있도록 합니다.
Android API에서는 두 가지 버전의 onReceivedError 메서드가 제공됩니다.
각 메서드는 API 버전과 기능적인 면에서 차이가 있습니다.
onReceivedError(WebView view, int errorCode, String description, String failingUrl)
지원 API 버전
- Introduced: Android API 1
- Deprecated: Android API 23 (Android 6.0, Marshmallow)
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
- view: 오류가 발생한 WebView 인스턴스
- errorCode: 오류 유형을 나타내는 정수 값 (예: ERROR_HOST_LOOKUP, ERROR_TIMEOUT 등)
- description: 오류에 대한 설명 문자열
- failingUrl: 실패한 URL 문자열
이 버전은 기본적으로 WebView가 로드에 실패한 URL과 오류 유형을 간단히 알려줍니다.
failingUrl을 통해 정확히 어느 리소스에서 문제가 발생했는지 확인할 수 있습니다.
개발자는 이 정보를 활용해 사용자에게 알림을 띄우거나 대체 동작(예: 에러 페이지 표시)을 수행할 수 있습니다.
모든 리소스 로드 오류에 대해 호출되며, 메인 프레임(main frame)과 서브 리소스(sub-resource) 구분 없이 동일하게 처리됩니다.
(그러나 실제로는 서브 리소스 오류가 주로 무시되거나 잘 드러나지 않는 경우가 많았습니다)
errorCode와 description만 제공되므로 오류의 원인이나 맥락에 대한 세부적인 정보는 제한적입니다.
onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)
지원 API 버전
- Introduced: Android API 23 (Android 6.0, Marshmallow)
- Deprecated: 아직 비활성화되지 않음 (최신 API에서도 유효)
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)
- view: 오류가 발생한 WebView 인스턴스
- request: 실패한 요청을 캡슐화한 객체(WebResourceRequest)로, URL, HTTP 메서드, 요청 헤더 등의 정보를 포함
- error: 오류 세부 사항을 담고 있는 객체(WebResourceError)로, 오류 코드 및 메시지를 제공
이 메서드는 보다 세분화되고 구조화된 정보를 제공합니다.
특히, WebResourceRequest와 WebResourceError 객체를 활용하면 이전 버전에 비해 다음과 같은 장점이 있습니다.
- WebResourceError.getErrorCode()와 WebResourceError.getDescription()을 통해 오류 정보를 보다 객체 지향적으로 처리 가능합니다.
- WebResourceRequest로 요청된 URL, HTTP 메서드(getMethod()), 헤더, 사용자 제어 여부 등을 확인할 수 있어 세부적인 제어가 가능합니다.
메서드 구현부 차이
WebViewClient 파일 내의 두 개의 메서드 정의된 내용을 확인해보면 아래와 같습니다.
두 개의 메서드 차이를 보면, isForMainFrame 여부에 따라서 deprecated 된 메서드를 호출하는 것으로 보입니다.
isForMainFrame는 Android의 WebResourceRequest 클래스에 포함된 속성으로, 요청된 리소스가 메인 프레임을 위한 것인지 아니면 서브 리소스(이미지, CSS 파일, 자바스크립트 등)를 위한 것인지를 구분하는 데 사용됩니다.
- 메인 프레임(Main Frame): WebView에서 로드되는 기본 문서(일반적으로 HTML 페이지)를 의미합니다.
- 서브 리소스(Sub-resource): 메인 프레임에서 로드되는 이미지, 스타일시트, 자바스크립트 등과 같은 부수적인 리소스를 의미합니다.
그리하여, request.isForMainFrame() 메서드를 통해 요청이 메인 페이지에 대한 것인지 서브 리소스에 대한 것인지를 구분할 수 있습니다.
override fun onReceivedError( view: WebView?, request: WebResourceRequest?, error: WebResourceError? ) {
if (request?.isForMainFrame == true) {
// 메인 프레임에서만 오류 처리
view?.loadData("<h1>페이지 로드 오류</h1>", "text/html", "UTF-8")
Log.e("WebViewError", "Main frame error: ${error?.description}") }
else {
// 서브 리소스 오류 처리
Log.w("WebViewError","Subresource error: ${request?.url} - ${error?.description}")
} }