안드로이드 개발 질문/답변
(글 수 45,052)
2010.08.21 12:19:55
우선 쓰레드라는 주제는 굉장히 어려운 주제라는 겁니다.
질문의 요지인 즉슨 쓰레드에서 외부 라이브러리(그것도 Socket을 사용하는)를 이용하는 부분 때문에 프로세스(정확히는 전체 쓰레드)가 sleep 된다는 의미 같습니다.
소스상 볼 때는 컨텍스트 스위칭이 안되고 HttpClient가 io쪽에 락을 거는 것 같습니다.
HttpClient 문서를 훓어보니 MultiThreadedHttpConnectionManager 라고 클래스가 존재하는 것을 보니 다행히 문제는 우회할 수 있을 듯 합니다.
2010.08.21 13:04:53
소스를 자세히 본건 아닙니다(정확한 답이 되지 않을수 있다는...)
정확하게 어떤 부분에서 문제가 발생하는지를 찾는것이 제일먼저 해야 할 일인것 같습니다.
우선 눈에 띄는 부분이 HttpClient 인데.. 네트웍 연결을 맺는 시간 + inputstream을 통해 가져오는 시간 + Close( close부분이 없네요)
이부분은 원래 시간이 발생하는 부분이어서 1. 이부분을 주석 처리후 해 보는 방법을 우선 해 보고, 2. 소스를 가져오는 부분을
즉 서버측 문서를 고의로 엄청나게 큰놈을 받아 보는겁니다. 그러면 확실히 이부분인지 아닌지를 알게될겁니다.
그러면 이부분에 대해서만 고민하면 되겠죠...
글구, inputstream을 읽을때 readLine으로 읽게 되면 new line character를 만나야지만 읽게 되므로 가끔 소스를 숨기기 위해 new line char를 지운 페이지를 만나면 문제가 발생할수 있으므로 일정크기의 byte단위로 읽게 되면 실행시 부담이 줄게 됩니다.
정확하게 어떤 부분에서 문제가 발생하는지를 찾는것이 제일먼저 해야 할 일인것 같습니다.
우선 눈에 띄는 부분이 HttpClient 인데.. 네트웍 연결을 맺는 시간 + inputstream을 통해 가져오는 시간 + Close( close부분이 없네요)
이부분은 원래 시간이 발생하는 부분이어서 1. 이부분을 주석 처리후 해 보는 방법을 우선 해 보고, 2. 소스를 가져오는 부분을
즉 서버측 문서를 고의로 엄청나게 큰놈을 받아 보는겁니다. 그러면 확실히 이부분인지 아닌지를 알게될겁니다.
그러면 이부분에 대해서만 고민하면 되겠죠...
글구, inputstream을 읽을때 readLine으로 읽게 되면 new line character를 만나야지만 읽게 되므로 가끔 소스를 숨기기 위해 new line char를 지운 페이지를 만나면 문제가 발생할수 있으므로 일정크기의 byte단위로 읽게 되면 실행시 부담이 줄게 됩니다.
2010.08.21 13:34:34
처리과정에서 너무 많은 메모리를 할당하고있는게 아닐까 생각되네요 ^^;
처리 중 생성한 매모리는 사용이 끝나면 gc에 의해 반환되는데요!
gc가 자주 호출되는것을 보니 로직에서 너무 많은 메모리를 할당하는것 같습니다.
많은 메모리를 사용하면 gc가 자주 호출되기 때문에 화면에 끊겨 보이는 현상이 나타날 수 있어요, gc가 일할 때에는 구동중인 어플리케이션을 잠시 멈춰 세우고(onPause/onStop 이런 개념이 아니에요;) 일을 하기 때문에 view의 invalidate() 메소드가 호출되지 못하여 뚝뚝 끊기는 것같습니다.
만약 가비지컬렉터의 자원반환에 의한 프레임 저하가 아니라면 스레드로 처리하는 로직에 부하가 있다는 이야기 인데,
이럴경우 해당 작업 스레드의 우선순위를 낮게 설정하시면 도움이 될것 같네요.
소스를 자세히 보지않고 답변드려 죄송합니다.^^;