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

AdvancedAsyncTask를 사용해 보았습니다. ^^ 관련 질문 드려요

0 추천
안녕하세요 말씀해 주신 AdvancedAsyncTask를 아무런 변경 없이 AsyncTask<> 선언 대신에 사용하고 핸들러에서 executeOnExecutor(AdvancedAsyncTask.getThreadPoolExecutor()와 같이 선언 해서 사용용 하니 앱 구동 시간이 늘긴 했는데

다음과 같은 에러 로그가 뜨네요
04-17 18:05:48.704 30529-31530/ W/111Error connection: Network error IOException: Connection timed out
04-17 18:05:48.711 30529-31530/ E/AndroidRuntime: FATAL EXCEPTION: AdvacnedAsyncTask #13
    Process: , PID: 30529
    java.lang.RuntimeException: An error occured while executing doInBackground()
        at net.sjava.advancedasynctask.AdvancedAsyncTask$PriorityFutureTask.done(AdvancedAsyncTask.java:287)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:762)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void java.sql.Connection.close()' on a null object reference
        at MainActivity$AsyncTask.doInBackground(MainActivity.java:293)
        at MainActivity$AsyncTask.doInBackground(MainActivity.java:230)
        at net.sjava.advancedasynctask.AdvancedAsyncTask$1.call(AdvancedAsyncTask.java:251)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:762)

제가 아직 많이 초보라서 핸들러를 사용안하고 메인 쓰레드(onCreate인가요)에서 사용하면 오류가 발생해서, 혹시 이부분에 대해서 조금 더 설명을 해 주실 수 없을까요? 아무튼 일단 구동시간이 늘어나서 빛을 발견한거 같아 너무 좋아요 ^^
쎄쌀 (250 포인트) 님이 2018년 4월 17일 질문
쎄쌀님이 2018년 4월 19일 수정

1개의 답변

+1 추천
 
채택된 답변

메인 스레드에서 IO 작업이 막혀 있습니다. 그 이유가.. IO로 인해서 블럭이 되면.. 화면이 멈추기 때문이죠.. 화면을 그리고 이벤트를 처리하는 스레드가 메인 스레드입니다. 그래서.. 스레드를 사용하고 그 결과를 핸들러를 사용해서 메인 스레드로 전달합니다. 물론 메인 스레드로 데이터가 넘어오기전에는 루퍼라는 놈을 통해서... 메인스레드로 전달이 되는데..  AsyncTask는 스레드에서 IO처리 및 결과를 루퍼로 전달하는 기능을 추상화한 구현체이죠.. 

그리고, 위 에러 콜스택에서 NullPointerException 이 발생했네요.. sqlconnnection 객체가 null입니다. 그리고 connection timeout은 사용하는 네트웍에 따라서 발생할 수 있는 이슈라서, 아래와 같이 처리해 주시면 됩니다. 

finally {

conn.close(); 

}

의 형태가.. 

finally {

if(conn != null) {

conn.close();

}

}

와 같이 바꿔야 합니다. 

mcsong (44,040 포인트) 님이 2018년 4월 18일 답변
쎄쌀님이 2018년 4월 18일 채택됨
감사합니다. 말씀하신 대로 커넥트 끊는 작업을 처리하니 중간에 앱이 꺼지지 않고 약 3시간 넘게 지속되네요 ㅎㅎ 그런데
I/art: Background partial concurrent mark sweep GC freed 161357(14MB) AllocSpace objects, 0(0B) LOS objects, 22% free, 53MB/69MB, paused 561us total 158.440ms 이런 메세지가 뜨면서 뒤에 용량이 계속 커지던데 이것도 따로 제어를 해줘야 하나요? 앱이 꺼지거나 동작이 멈추거나 하지는 않습니다.
MainViewActivity의 SamplingAsyncTask를

class SamplingAsyncTask 가 아니라..
static class SamplingAsyncTask 로 하시면 메모리 릭이 해결이 될 겁니다. 또는 SamplingAsyncTask를 외부 클래스로 작성하시면 됩니다.

이건 inner class 인스턴스가 MainViewActivity에 coupling 되어 있어서.. 메모리 릭이 날 소지가 있습니다.
감사합니다. 약 삼십분 정도 구동시켜 봤는데 메모리 릭(?)관련 메세지는 안 뜨네요 ㅎㅎ
...