마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[Kotlin] 안드로이드 마켓버전 가져오기 AsycTask 오류입니다.

0 추천

자동 업데이트 처리를 위해 기존 자바에서 쓰던 마켓버전 가져오는 소스를 그대로 가져왔습니다. 디버그로 앱을 설치했을때는 문제없이 잘 동작합니다(현재 마켓 올라가있는 버전 가져오기)

하지만 앱을 마켓에서 다운받으면 계속 앱이 실행이 안되고 튕기길래 뭔가 해서 봣더니 AsycTask에서 에러가 나더라고요.

java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:354)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.ExceptionInInitializerError
        at org.jsoup.nodes.Entities.access$000(Entities.java:17)
        at org.jsoup.nodes.Entities$EscapeMode.<clinit>(Entities.java:20)
        at org.jsoup.nodes.Document$OutputSettings.<init>(Document.java:371)
        at org.jsoup.nodes.Document.<init>(Document.java:18)
        at org.jsoup.parser.TreeBuilder.initialiseParse(TreeBuilder.java:29)
        at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:42)
        at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:52)
        at org.jsoup.parser.Parser.parseInput(Parser.java:30)
        at org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:136)
        at org.jsoup.helper.HttpConnection$Response.parse(HttpConnection.java:653)
        at org.jsoup.helper.HttpConnection.get(HttpConnection.java:217)
        at 

intro.view.IntroActivity$getMarketVersion.doInBackground(IntroActivity.kt:337)
        at 

intro.view.IntroActivity$getMarketVersion.doInBackground(IntroActivity.kt:323)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 

 

아래는 코드입니다.

 SaveMarketVersion = getMarketVersion().execute().get()
   
private inner class getMarketVersion : AsyncTask<String, String, String>() {

    internal var MarketVersion: String = ""

    override fun onPreExecute() {
        super.onPreExecute()
    }

    override fun doInBackground(vararg params: String): String {
        try {
            MarketVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + packageName + "&hl=ko")
                .timeout(30000)
                .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                .referrer("http://www.google.com")
                .get()
                .select("div.hAyfc:nth-child(4) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)")
                .first()
                .ownText()
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return MarketVersion
    }
}

에러 위치는 Jsoup.connect() 뒤의 .timeout() .get() .select() 이런 부분에서 납니다.

 

답변 해주시면 감사하겠습니다.
익명사용자 님이 2019년 9월 24일 질문

2개의 답변

0 추천
proguard 썼으면 https://stackoverflow.com/a/44392732/1025379 확인해보세요
쎄미 (162,410 포인트) 님이 2019년 9월 24일 답변
proguard는 안썻는데 시도 해봐야 되겠네요. 앱 업데이트 한번 해봐야 될 듯 합니다. ㅎㅎ 감사합니다.
안 썼으면 다른 원인일 것 같습니다.
0 추천
getMarketVersion().execute().get()

안녕하세요. 위 구문은 동기방식이 될텐데요.

풀 소스가 없어서 정확한 원인이라고 판단할 수는 없으나

경험상 위 방식은 조금은 신중히 코드를 관리해야 에러가 발생하지 않습니다.

특히나 doInbackground에서 타임 아웃이 30초나 되니 서버 상태에 따라 프론트는 30초나

해당 코드가 동기화 되기 때문에 위험하다고 할 수 있습니다.

그렇게 되어도 해당 코드 이후 코드들 혹은 사전 정의해둔 코드등에 문제가 없는지

잘 살펴보시길 바랍니다.

 

쭈쭈총각 (17,750 포인트) 님이 2019년 9월 26일 답변
...