" Park 기술 블로그 "
# 카테고리
# 도구
[Android 안드로이드] WebViewClient와 onReceivedError
2022-02-17 00:58:29

최근 WebView에 대한 내용을 다루면서 삽질? 했던 후기를 남기려고 한다.

보통 WebView에는 WebViewClient와 WebChromeClient를 부착하고 사용한다. 이 해당 Client들에는 수 많은 콜백 메서드들이 있고 필요에 따라서 찾아 override해서 사용하면 된다. 그런데 내가 삽질했던 내용은 WebViewClient에 대한 내용이고 이 내용을 설명하려면 웹 페이지에 대한 기초적인 내용을 먼저 배경 설명을 해야한다.

 

한 개의 웹 페이지를 요청하면, html을 불러오고, 그 다음 html 안에 있는 img 태그, iframe, script, style 등등 리소스에 대해서 로딩이 수행된다. 즉, 웹 페이지 한 개를 요청한다고 해서 한 개의 Request만 수행되는게 아니다. 이렇게 한 개의 페이지에서 여러 개의 데이터 Request가 발생하는데 그렇다고 하면 이 MainFrame요청(html 페이지 요청) 실패할 때 말고 부가적인 img, iframe 등등에 대한 요청에서도 실패가 될 수 있다는 말이 된다. 즉 WebViewClient에서 Request에 대한 Error 시 호출되는 콜백인 onReceivedError가 MainFrame 요청 외 img, iframe 등등의 리소스 요청 실패에도 호출된다는 것이다. 이 부분을 해결하기 위해서 많은 삽질을 하였으나 생각보다 아주아주 간단했다.

 

위의 삽질의 종지부는 onReceivedError의 super.onReceivedError를 확인해보면 isForMainFrame이라는 걸 발견함에서 시작할 수 있었다. 이 메서드는 WebResourceRequest에 있는 메서드고 주석을 보면 MainFrame 요청에 대해서 true를 반환하고, Subresources나 iframe에 대해서 false를 리턴한다고 한다. 그래서 생각보다 아주 쉽게 MainFrame 요청에 대한 Error를 따로 분기할 수 있었다.

 

참고로 onReceivedError는 두 개의 overloading된 함수가 있는데, 

void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)

위의 함수와 아래의 함수가 있다.

void onReceivedError(WebView view, int errorCode, String description, String failingUrl)

1번 함수는 현재 유효한 함수고 아래의 2번 함수는 Deprecated 함수다. 그러나 WebViewClient의 내용을 보면 쉽게 알 수 있듯이, 2번의 함수는 1번의 함수 안에서 isForMainFrame일 때만 호출되도록 구현되어 있다. 그래서 1번을 사용하면 기본적으로 MainFrame 외의 리소스 Request error 시에도 호출되고, 2번을 사용하면 기본적으로 MainFrame에 대한 Error일 때만 호출된다. (2번을 사용하면 취소선에 눈이 아플 것이다.)

 

아래 사진은 1번과 2번의 함수 정의다.

 

 

2
# 댓글 + 새 댓글 작성
# 새 댓글 작성
댓글 암호는 댓글 삭제 시 필요합니다.
# 님에게 답변 작성
대댓글 암호는 댓글 삭제 시 필요합니다.
# 님의 댓글 삭제
댓글 작성 시 입력했던 암호를 입력해주세요.
ㅋㅋㅇㅈ 2022-03-04 15:31:56
ㅋㅋㅇㅈ 이런꿀팁이?
2022-03-20 19:15:43   ㅇㅈㅋㅋ
ㅇㅈㅋㅋ 저런꿀팁이?