본문 바로가기
Android

WebView 현재 페이지가 로딩이 됐는지 알아보는 방법.

by 일용직 코딩노동자 2020. 4. 14.
728x90
반응형

WebView 페이지가 로딩이 다 이뤄졌는지 안이뤄졌는지 여부에 따라

 

개발을 진행하고싶으신 분들이 있으실겁니다.

 

그 내용에 대해서 포스팅해볼게요.

 

우선 간단한 방법 부터 하나볼게요.

 

mWebView.setWebChromeClient(new WebChromeClient() {
@Override
            public void onProgressChanged(WebView view, int newProgress) {
                Log.d("로딩", String.valueOf(newProgress));
                super.onProgressChanged(view, newProgress);
            }
        });

여기서 로그에찍어놓은 newProgress가 0부터 시작하여 100까지 간다면 로딩이 다 되었다는 것인데요.

 

매우 간단하게 처리해볼수있습니다.

 

또 만약에 이 방법이 부정확하다면 다른 방법도 있습니다.

 

약간 복잡하지만 저는 이방법으로 구현했습니다.

 

Handler Loding_Handler = new Handler(); //onCreate 밖 클래스딴 전역

Runnable ReStart = new Runnable() {
        /**
         * 재귀함수를 실행해주는 핸들러
         */
        @Override
        public void run() {
            LinkLogin_Check();
        }
    };

    private void LinkLogin_Check(){
        /**
         * 현재 메인페이지로 왔는지 체크
         * 메인페이지가 아니라면 핸들러로 2초뒤 재귀함수실행
         * 다시 실행되어 지속적으로 로그인이 된 메인페이지인지 상태여부를 체크
         */
        if(mWebView.getUrl().contains("loginMain")){
            //메인페이지로 로그인완료
            return;
        }
        else{
        	//아직 로딩전...
            Loding_Handler.postDelayed(ReStart,2000);
        }
    }

저는 이 로직으로 로딩완료를 체크했습니다.

 

설명드리자면 재귀함수와 핸들러의 조합인데요.

 

WebView라고하면 하이브리드 앱입니다.

 

그럼 해당 페이지의 URL주소가 있겠는데요. 저는 getUrl메소드를 이용하여 현재 페이지의 주소를 받아와서 

 

contains로 비교합니다. 

 

contains는 비교하고자 하는 문장에 제가 비교하는 문장이 들어가있다면 트루값이 나옵니다.

 

저는 메인페이지가 로딩이됐는지 보기위해 페이지 URL중에 loginMain이란 문자열이 들어가서 이것으로 비교했습니다.

 

그럼 현재 메인페이지로 왔다면 if문에서 여러분들이 하고싶은 임의의 처리를 하시면 return으로 함수가 종료됩니다.

 

하지만 그게 아니라면 2초뒤 핸들러로 ReStart 핸들러를 실행합니다.

 

핸들러 내용을 보시면 다시 LinkLogin_Check함수를 호출합니다.

 

자기자신을 다시한번 호출하는것을 재귀함수라고합니다.

 

뭔가 탈출의 조건이없다면 재귀함수는 무한루프에 빠질 수 있으니 주의하셔서 사용하셔야합니다.

 

LinkLogin_Check함수의 사용부분은 onCreate에서 WebView를 loadurl하실때 그 바로 아랫줄에 적어주시면 됩니다.

 

--

이 로직을 무한루프로 구현을 해보려했지만 앱에 과부화가 걸리는 현상이 있었습니다.

 

핸들러로 적당한 딜레이를 주어 과부화 현상을 해결했습니다.

 

궁금하신 사항은 댓글주세요.

728x90
반응형

댓글