AsyncTask 에서 뷰에 접근시의 동기화 처리

프로그래밍/Android 2013. 10. 6. 20:33

AsyncTask 에서 뷰에 접근시의 동기화 처리


 AsyncTask 를 사용하는 이유는 네트워크 작업이나. 시간이 오래 걸리는 작업을 별도의 쓰레드에서 처리하게 함으로써

메인 UI 가 부드럽게 작동되게 하기 위해서 입니다.

자바 프로그램처럼 Thread 나 Runnable 을 사용해도 되지만 안드로이드 앱에서는 AsyncTask 를 사용하기를 권장하고 있습니다.


 앱을 개발하면서 몇일 전에 겪은 에러 중에 하나를 소개해 드리면, 버튼을 여러번 터치했을때 앱이 다운되는 증상이 있었습니다.

버튼의 기능은 사용자가 터치했을 때 네트워크를 통해서 웹 상의 데이터를 다운로드하여 사용자의 화면에 표시하는 기능이었습니다.

하지만 테스트시 해당 버튼을 연속적으로 빠르게 터치했을 때 별다른 이유없이 앱이 종료되었습니다.


이유는 동기화문제였습니다.


 웹 프로그래밍의 경우는 쓰레드에 항상 신경을 쓰고 개발을 했기 때문에 동기화에 대한 처리가 잘 이뤄지도록 신경써서 개발하지만

반면에 안드로이드 앱의 경우는 동기화에 대한 처리가 부족했기 때문입니다.

그럼 왜 동기화가 필요한 걸까요?

위의 예처럼 사용자가 버튼을 연속으로 클릭하게 되면 클릭한 수 만큼 AsynTask 가 수행됩니다. 

즉 그만큼 쓰레드가 내부적으로 생성되어 네트워크 작업을 처리하기 위해 생성됩니다. 

생성되는 것만으로는 오류가 발생하지 않습니다.

하지만 가져온 데이터를 파싱하여 사용자의 화면에 뿌려주려고 할때 오류가 발생합니다.

사용자에게 보여지는 뷰는 단 하나일 뿐이고 해당 뷰를 여러개의 쓰레드가 경쟁적으로 사용할려다 보니 

View 가 이유없이 깨진다던지 아니면 충돌이 일어나 앱이 종료되는 현상이 발생하였습니다.


따라서 

해당 오류를 해결하기 위해서는

1. 사용자의 클릭을 제한하기 위해서 한번 클릭이 된 버튼은 비활성 처리를 하고 작업이 완료시 다시 활성 시켜주면 됩니다.

2. View 에 접근하는 작업은 synchronized 를 사용하여 한번에 하나의 쓰레드만 작업을 처리할 수 있도록 해줍니다.


끝.




: