본문 바로가기

안드로이드

웹뷰 관련 토막상식

웹뷰는 이상하게 양질의 자료를 찾기 힘들다.

그래서 회사에서 맨날 두들겨 맞으면서 배우게됨

 

뭐하나 배울때마다 정리할곳이 필요한데 이곳은 웹뷰 관련 토막 상식을 정리하려 한다.

오늘 기존에 알고있던 문제인데 그거가지고 4시간동안 뻘짓해서 만드는거 아님

 

1. 웹뷰 브릿지에서 작업치면 비동기로 동작한다.

브릿지에다가 함수 담아서 실행시킬때 따로 쓰레드 처리 안하면 백그라운드 스레드에서 돈다.

즉 뭐 setText같은거 해주면 문제가 생긴다는 뜻이다.

근데 웃긴게 차라리 터지면 좋은데 노란색으로 에러관련 로그만 뜨고 동작을 안한다.

그래서 로그 안보면 대체 왜이래? 이러면서 구천을 떠돌게 된다.

또한 웹뷰 관련된거 디버깅 걸어놔도 main 쓰레드에서 도는게 아니니 ANR이 걸리지 않는다.

웹뷰는 ANR면역이라고 봐도되지만 면역이면 뭐하겠는가 그소리는 기능이 동작하지 않는다는 뜻인데 

-> 로그 잘보고 적절하게 심어야하는 교훈도 되긴한다.

2. CookieManager의 setCookie 함수는 비동기로 동작한다.

웹뷰 내 쿠키를 심어주기 위해 웹 개발자의 오더에 따라 쿠키를 심는 경우가 종종있다.

쿠키는 개념적으로 공부해놓으면 좋다.(은근 여기저기 많이 쓰인다) 

또한 쿠키 말고도 쿼리파람이라던지 웹측 지식을 알면 웹 개발자가 계속 중복하여 요청하는것을 현명하게 조율 할 수 있다.

 

뭐 어쨋든 토막상식이니 setCookie를 살펴보면 이 함수가 비동기로 동작한다는것만 알고가면 된다.

비동기로 동작하니 당연히 그에 따른 동작에 신경쓸 부분이 있을것이다. 이를 신경써서 코딩하자

 

그냥 편의상 내가 SuspendCancellableCoroutine을 이용해서 코루틴에 합류시켜서 쓸수 있도록 코드 조각을 짜놨는데 겸사겸사 공유합니다.

data class CookieData(
    val key: String,
    val value: String
)

@OptIn(ExperimentalCoroutinesApi::class)
private suspend fun setCookie(cookieDatas: List<CookieData>) {
    suspendCancellableCoroutine { continuation ->
        val cookieManager = CookieManager.getInstance().apply {
            setAcceptCookie(true)
        }

        var cookieSettingCompletedCount = 0

        cookieDatas.forEach {
            cookieManager.setCookie("적용할 Url", "${it.key}=${it.value}") {
                cookieSettingCompletedCount++
                if (cookieSettingCompletedCount == cookieDatas.size) {
                    cookieManager.flush()
                    continuation.resume(Unit) {
                        Log.d("멧돼지 코드임", "쿠키세팅 완료")
                    }
                }
            }
        }
    }
}

 

아 참고로 해당코드에 쿠키를 "Cookie: <이름>=<>; <이름>=<>; <이름>=<>" 이런식으로 합쳐서 보내는걸 안쓰는 이유는 안드로이드 CookieManager에서 이 방법을 지원을 안해서이다. 그래서 forEach 문으로 쭉쭉 돌도록 코드를 구성했다.