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

메인스레드에서 작업처리량

0 추천

Skipped 105 frames!  The application may be doing too much work on its main thread.

위의 메세지가 뜨는데 어떻게 해야하나요?? 뭐 메세지에서는 메인스레드에서 작업이 너무 많다 그러는데,
지금 딱히 하는 작업이 SQLite3에서 데이터 읽어서 뿌려주는것 뿐입니다. 물론 쿼리가 반복문으로 루프되고 있기때문에
DB에 쿼리하는 부분은 Async에서 돌리고 있습니다. 쿼리가 다 끝나면 postExecute에서 뷰를 생성하고 있구요..
 
그리고 DB는 암호화 되어 있어서 쿼리시 암호화 로직도 함께 돌아갑니다. 약간 무겁긴 하지만, 제능력에서 생각하자면
지금 상황에선 최선이라 여겨지는데요,, 
 
물론 좋은단말에서 돌리면 별 문제 없이 잘돌아갑니다. 갤럭시노트10.1 2014에서요, 근데 조금 성능이 안좋은 중소기업
제품이 있는데 여기서 돌리면 말도안나옵니다.. 위에 빨간 메세지 계속뜨고 따운먹고.. ㅜ 단순히 기계 성능 탓일까요? 아니면 제가 소스코드상에서 뭔가 더 할 수 있는게 있을까요? 도아주세요 ㅜ 
익명사용자 님이 2014년 7월 29일 질문

2개의 답변

0 추천
 
채택된 답변
쿼리만 별도 스레드에서 돌리나요, 아니면 쿼리 결과에서 각 컬럼 데이터를 가져오는 것도 별도 스레드에서 돌리나요?
익명사용자 님이 2014년 7월 29일 답변
질문 하신게 잘 이해는 안가는데,, 각 컬럼 데이터를 가져오는 것도 별도 스레드에서 돌리나요? <-- 이부분이요.. 일단 지금 현재는 async의 doInBackground에서 쿼리를 해서 데이터를 받아옵니다. 그리고 받아온 데이터를 onPostExecute에서 풀어서 뷰객체들을 생성하게 해놨습니다.
Cursor.getString , Cursor.getInt 등 쿼리결과 Cursor에서 데이터를 얻는 작업을 어느 스레드에서 하는지 물어보는 겁니다.
쿼리만 한다고 실제 데이터를 읽어오는게 아니라 getString 등을 호출할 때 데이터를 읽어옵니다. 이작업을 메인스레드에서 하면 성능이 떨어질 수 있습니다.

일단 생각나는 대로 말씀드리면 뷰 업데이트 이외의 모든 것을 별도 스레드에서 실행하도록 해보세요.
DB에 접속하고 클래스를 따로 정의해 뒀기에 doInBackground에서 그 객체를 만들어서 그 안에서Cursor.getString , Cursor.getInt 같이 읽는 작업을 하고 있습니다..
제가 헛다리를 짚었군요.

메인스레드에서 관련된 부분에 시간측정 코드를 삽입하여 어느 부분이 시간이 많이 걸리는지 보는건 어떨까요?
0 추천
일을 좀 더 많이하게 하시고,

1. 일 처리하는데 주석처리

2. 뷰 생성하는데 주석처리

어느 부분이 문제인지 정확히 파악하고난 후 접근해보세요.  divide and conquer!!
Gioskhan (12,060 포인트) 님이 2014년 7월 29일 답변
...