WebView ProgressBar 제어
ProgressBar 제어
private class MyWebViewClient extends WebViewClient {
@Override public void onPageStarted(WebView view, String url, Bitmap favicon) {
progressBar.show();
super.onPageStarted(view, url, favicon);
}
@Override public void onPageFinished(WebView view, String url) {
progressBar.hide();
super.onPageFinished(view, url);
}
}
private class MyWebChromeClient extends WebChromeClient {
@Override public void onProgressChanged(WebView view, int newProgress) {
progressBar.setProgress(newProgress);
super.onProgressChanged(view, newProgress);
}
}
로딩중 화면 종료할 때 ProgressBar 처리
progressBar를 구현한 상태에서, 웹페이지를 불러오는 중에 화면을 종료하면 NPE가 발생한다. progressBar.set(newProgress) 부분이다. 화면 종료 후 View가 제거된 상태에서 View의 메서드를 참조하려했기 때문이다. View는 제거됐지만, WebViewClient, WebChromeClient는 제거되지 않았다는 말이 된다.
NEP를 막는 방법은 두 가지다. progressBar를 null체크하여 사용하거나 WebView의 destory를 호출하는 방법이다.
null체크하는 방법은 지저분해 보인다. 화면이 종료된 후에도 WebViewClient, WebchromeClient가 남아 있다는 사실은 찝찝하기까지 하다.
때문에,
destory()를 호출하는 방법을 권장한다. onDestory를 호출하면 더 이상 WebViewClient나 WebChromeClient를 더이상 호출되지 않는다. 웹뷰 내부 상태들을 파괴하기 때문이다.
@Override protected void onDestroy() {
webView.destroy();
super.onDestroy();
}