AsyncTask 에서 뷰에 접근시의 동기화 처리
프로그래밍/Android 2013. 10. 6. 20:33AsyncTask 에서 뷰에 접근시의 동기화 처리
AsyncTask 를 사용하는 이유는 네트워크 작업이나. 시간이 오래 걸리는 작업을 별도의 쓰레드에서 처리하게 함으로써
메인 UI 가 부드럽게 작동되게 하기 위해서 입니다.
자바 프로그램처럼 Thread 나 Runnable 을 사용해도 되지만 안드로이드 앱에서는 AsyncTask 를 사용하기를 권장하고 있습니다.
앱을 개발하면서 몇일 전에 겪은 에러 중에 하나를 소개해 드리면, 버튼을 여러번 터치했을때 앱이 다운되는 증상이 있었습니다.
버튼의 기능은 사용자가 터치했을 때 네트워크를 통해서 웹 상의 데이터를 다운로드하여 사용자의 화면에 표시하는 기능이었습니다.
하지만 테스트시 해당 버튼을 연속적으로 빠르게 터치했을 때 별다른 이유없이 앱이 종료되었습니다.
이유는 동기화문제였습니다.
웹 프로그래밍의 경우는 쓰레드에 항상 신경을 쓰고 개발을 했기 때문에 동기화에 대한 처리가 잘 이뤄지도록 신경써서 개발하지만
반면에 안드로이드 앱의 경우는 동기화에 대한 처리가 부족했기 때문입니다.
그럼 왜 동기화가 필요한 걸까요?
위의 예처럼 사용자가 버튼을 연속으로 클릭하게 되면 클릭한 수 만큼 AsynTask 가 수행됩니다.
즉 그만큼 쓰레드가 내부적으로 생성되어 네트워크 작업을 처리하기 위해 생성됩니다.
생성되는 것만으로는 오류가 발생하지 않습니다.
하지만 가져온 데이터를 파싱하여 사용자의 화면에 뿌려주려고 할때 오류가 발생합니다.
사용자에게 보여지는 뷰는 단 하나일 뿐이고 해당 뷰를 여러개의 쓰레드가 경쟁적으로 사용할려다 보니
View 가 이유없이 깨진다던지 아니면 충돌이 일어나 앱이 종료되는 현상이 발생하였습니다.
따라서
해당 오류를 해결하기 위해서는
1. 사용자의 클릭을 제한하기 위해서 한번 클릭이 된 버튼은 비활성 처리를 하고 작업이 완료시 다시 활성 시켜주면 됩니다.
2. View 에 접근하는 작업은 synchronized 를 사용하여 한번에 하나의 쓰레드만 작업을 처리할 수 있도록 해줍니다.
끝.
'프로그래밍 > Android' 카테고리의 다른 글
Activity EditText 에 자동 포커싱 방지하기 (0) | 2013.10.06 |
---|---|
안드로이드 ListView 스크롤시 배경색 변경 안되도록 (0) | 2013.09.27 |
android ListView Adapter의 getView 메소드에 대한 이해 (0) | 2013.09.24 |
greenDAO 두 Entity 간에 관계 설정하기 (0) | 2013.09.24 |
greenDAO insert 성능 향상시키는법 (0) | 2013.09.13 |