안드로이드 개발 질문/답변
(글 수 45,052)
문제인 즉, 유저가 어떠한 이벤트를 발생 시켰을때 해당 api에 관련된 모든 정보들을 리스트뷰에 뿌려줍니다.
즉, 어떠한 목록을 받아올려면 각각의 api에 대해 처리를 해서 서버에서 response를 받아야 한다는 말이겠지요
그래서 말인데요, 이때 로드되어 오는 와중에 현제 나온 디바이스중, 스펙이 뛰어나거나 해당 디바이스의 os가 아이낸드를 쓰는
디바이스에는 그러한 블랙스크린이 이슈가 되지 않는데요, 펌웨어2.2의 겔스에선 그런 이슈가 나타나고 있습니다.
이것은 지금 해외에서도 많은 이슈가 되고 있는 걸로 알고 있는데요.. 이러한 정보에대해서 속시원하게 답변 해 주실분이 계신가
싶어서 질문을 드립니다.
제 질문이 이해가 안간다는 부분이나 좀더 세부적인 사항을 알고 싶다 하신분은 연락주시고 해당 이슈를 경험해 보셧거나
잘 알고 계신분이 있거나 하시면 답변 부탁드립니다.
블랙스크린이란 액티비티 전환에 있어서 중간에서 검은화면이 나타났다가 전환 되는 것을 말합니다.
사전 조건으로 서버와의 http 통신이 들어 갑니다. 이때 의심해볼 여지는 많은 api를 받아 옴으로서
디바이스 os의 성능이 딸리기 때문이라 의심이 되지만, 프로그램의 구조상으로 고칠 수 있는 부분이라 예상되기도 합니다.
많은 고수분들의 답변 기다리겠습니다..
2011.02.18 16:49:16
일단 어떤 현상인지 정확한 판단이 안서는데,
혹시 말씀하신 현상이 log상에 gc.freed가 엄청나게 호출되는 경우 아닌가요? 그렇다면 달빅의 가비지컬랙션에 관한 문서를 찾아보시면 도움이 되지 않을까 생각합니다.저도 어플 개발중에 말씀하신 블랙스크린 현상(액티비티 전환 중 3-5초간 블랙스크린이 나타나는)을 본 적이 있는데, 이를 해결하고자 별의별 검색과 별의별 코드발적화(ㅠㅠ실력이딸려서)를 해서 이를 해결(?)한 경험이 있거든요.
가득차버린 메모리 수급을 위한 gc.freed가 대거 호출되는 랙현상이라면,,,
그리고 이에 해당하는 명쾌한 답변을 찾게 되신다면 같이 공유했으면 하는 바램입니다!.
ps. 고수는 아니지만 저 또한 비슷한(? 혹은 같은) 문제로 고생을 해봤기에 관심 댓글을 달아봤습니다. 화이팅이요!
2011.02.23 14:47:36
액티비티 전환에서 인텐트를 스타트 시킨게 아니라 모두 getapplicationcontext()를 이용하여 context()를 넘겨 주는 방식으로 구조화 되어 있습니다. 그런데 사실 이러한 부분들이 문제가 되는지 의심 스러운 부분이라 추정만 하고 있습니다.
약간더 확실한건 i/o의 문제 때문에 그런거 같은데요
사실 리스트에 api를 뿌릴때 현실적으로 동기처리를 해줄 수 는 없다고 봅니다. 딱 정해진.. 예를들어 로그인 부분을 처리하는것도 아니고
리스트에 뿌려줄때 각각의 api는 가져오는 시간이 다 틀리기 때문에 (용량등이유) 비동기식으로 처리하는데요
님이 말씀하신 비동기 쓰레드로 처리했을때 쓰레드간의 충돌때문에 그러한 현상이 이러난다면
제가 언급한듯이 블랙스크린이 뜨고 다시금 정상적인 리스트(즉 해당 액티비티)로 넘어가지않고 오류가 나서 아예
죽어버릴겁니다. 그리고 비동기로 안하고 화면을 잡아놓고 계시면 생길수도 있다는게 어떤 말씀이신지 말씀해 주십시요.
그리고 다른 정보 있으신분 답변 기다리겠습니다.
약간더 확실한건 i/o의 문제 때문에 그런거 같은데요
사실 리스트에 api를 뿌릴때 현실적으로 동기처리를 해줄 수 는 없다고 봅니다. 딱 정해진.. 예를들어 로그인 부분을 처리하는것도 아니고
리스트에 뿌려줄때 각각의 api는 가져오는 시간이 다 틀리기 때문에 (용량등이유) 비동기식으로 처리하는데요
님이 말씀하신 비동기 쓰레드로 처리했을때 쓰레드간의 충돌때문에 그러한 현상이 이러난다면
제가 언급한듯이 블랙스크린이 뜨고 다시금 정상적인 리스트(즉 해당 액티비티)로 넘어가지않고 오류가 나서 아예
죽어버릴겁니다. 그리고 비동기로 안하고 화면을 잡아놓고 계시면 생길수도 있다는게 어떤 말씀이신지 말씀해 주십시요.
그리고 다른 정보 있으신분 답변 기다리겠습니다.
2011.02.24 21:44:07
어떤 답변이 달리나 궁금해서 계속 지켜보고 있는 게시물인데요 ㅋ
1. WHAT is GetApplicationContext() for, WHY USE IT
쭈쭈총각님께서는 언급하신 < getapplicationcontext()를 넘겨주는 구조 >를 통해 엑티비티 전환을 수행하시는 듯 한데 일반적으로 사용하는 < StartActivity ( INTETN A ) > 를 쓰지 않는 특별한 목적이 있나요? 어떤 장점과 어떤 차이가 있는지 무지한 저에게 설명 좀 해주실수 있을까요? ^^; 그에 관해 제가 아는 거라곤 getapplicationcontext()는 Service 객체 포인트를 얻어와서 쓰는 것(?). ,,,서비스를 사용하게 되면 main UI thread와는 상관이 없을테니 블랙스크린이 뜨는게 맞지 않는게 아니냐?는 관점에서 질문을 남기신건가요? 이에 관한 검색을 해보았지만 좋은 문서를 아직 찾지 못해 질문을 남겨요.
2. API를 뿌린다는 의미?
무슨 의미이죠...제가 개발영역에 발을 들여놓은지 얼마안되는 햇병아리라 API를 뿌린다는 의미가 알고 싶네요. 일종의 은어적 표현인가요? (정규적인 표현으로서의 API는 익히 알아왔지만, API를 뿌린다는 표현은 처음이라 실무 개발쪽에서 사용하는 일종의 은어가 아닌지 궁금하네요. )
3. LOG는 뭐라고 말해주나요?
LOG를 보면 그 이유가 대체로 명확해지던데, 쭈쭈총각님께서 말씀하시는 현상이 일어나는 동안의 LOG에는 무엇이 찍히던가요? 이 부분을 언급치 않으신다면 해결책을 찾는게 불가능해보이거든요.
3.5 꼬룡님의 답변이란
tcp 방식으로 통신을 하게 되는 경우에 액티비티 전환을 하게 되면, 운이좋으면(best-case : 통신상태좋고,서버원활하니) 블랙스크린 없이 바로 화면 전환되고 결과물이 뜨겠지만, 최악의경우(worst-case : 통신상태안좋고,서버과부화) ConnectionTimeOut에서 설정한 wait_time의 최대시간까지 블랙스크린을 보게 되는 경우를 맛보게 된다는 말씀이시겠죠? 그런데 이런 경우 runnable로 sub thread 등록해서 통신 메소드만 따로 돌리면 해결되는건데, 이미 쭈쭈님은 아시는 듯하고.....
4. 다시 한번 되새김질하자면
쭈쭈총각님의 문제란
a. GCfreed의 문제 (제가 언급했던)
b. Main UI thread - Sub thread를 잘못 사용하여 발생한 문제(꼬룡님께서 언급했던)
a,b 두경우에 해당하지 않는 전혀 다른 문제에서 발생한다는 건가요?
대체 뭔가여 @..@a



