Dev.
간단한 AsyncTask 구현 법 (외부쓰레드) 본문
작업을 하다보면 메인 쓰레드에서의 작업을 피해야 할 경우가 생긴다.
예를 들면 다수의 비트맵파일을 로드해야하는 경우나, 사이즈가 상당히 큰 파일을 로드해야 할 때.
안드로이드는 기본적으로 5초 이상 앱의 응답이 없는 대기상태가 될 경우,
ANR (Application Not Responding) 상태로 빠지게 된다.
흔히 보게되는 '어플리케이션이 응답하지 않습니다, 대기/종료(?)' 뭐 이런 팝업이 뜨는 경우를 말한다.
아래의 예제에 활용되는 AsyncTask는 큰 작업을 할 때 메인쓰레드가 아닌 외부쓰레드로 빼서 따로돌려
위에서 말한 ANR을 피해갈 수 있는 가장 간단한 방법 중 하나이다.
예는 빈번히 ANR을 호출하는 비트맵 로딩 관련 AsyncTask 구현 법이다.
/** @Author pppdw * @Description AsyncTask 구현 **/ class Async_Bitmap extends AsyncTask{ //위 선언시 인자값이 자꾸 이상하게 파싱된다.. AsyncTask 로 작성하면된다 public Async_Bitmap() { //컨스트럭쳐.. 사용을 위해 AsyncTask 선언시 따로 넘겨야할 밸류값을 넘길 수 있다. // TODO Auto-generated constructor stub } @Override protected void onPreExecute() { //AsyncTask를 처음 탈때, 즉 작업이 시작될때 타는 곳이다. //로딩바 같은것들이 선언되면됨 // TODO Auto-generated method stub super.onPreExecute(); } @Override protected Bitmap doInBackground(Integer... params) { //이 부분이 실제로 작업을 백그라운드상에서 돌려주는 부분이다. // TODO Auto-generated method stub int data = params[0]; Bitmap bm = null; if(data == R.id.img_thum_01){ bm = mainImg; }else if(data == R.id.img_thum_02){ bm = doSharpScale(mainImg_Clone); }else if(data == R.id.img_thum_03){ bm = doBrightnessScale(mainImg_Clone); }else{ bm = doGreyScale(mainImg_Clone); } //doSharpScale,doBrightnessScale,doGreyScale 함수들은 무시해도 된다. //사실 위 공간에 코딩된 코드자체를 무시해도된다. //결론은 그냥 리턴값으로 활용될 비트맵만 만들면 된다. return bm; //여기서 리턴되는 비트맵이 아래 onPostExecute의 파라메터인 result에 들어가게 된다. } @Override protected void onPostExecute(Bitmap result) { //작업이 종료되었을때 타는 곳이다. //postExcute에서 로딩바 선언했으면 닫는 구문같은걸 추가하면 된다. // TODO Auto-generated method stub super.onPostExecute(result); imgMain.setImageBitmap(result); //비트맵 로드를 doInBackground 에서 마친뒤 이곳으로 리턴되어 넘어오게 되고, //이곳에선 순수 사용할 이미지에 비트맵만 붙이면 완성이다. } } /** @Author pppdw * @Description AsyncTask를 사용하기위해 호출하는 부분이다. **/ Async_Bitmap mAsyncBimap = new Async_Bitmap(); //설명 안해도 될듯하지만, 생성자. 컨스트럭쳐로 접근.. mAsyncBimap.execute(imgThumb[j].getId()); //doInBackground를 부르는 객체, //이렇게만 선언해도 postExcute가 먼저 호출된 뒤, doInBackground를 타게된다. //인자 값으로 보내주는건 이미지뷰의 ID인데 왜보냈는지는 doInBackground에 선언된 IfEsle문을 보면된다.. //딱히 아이디값 같은게 필요없으면 신경쓰지않아도 된다.
'Android' 카테고리의 다른 글
AsyncTask, doInBackground 호출이 안되는경우. (0) | 2016.06.08 |
---|---|
정말 간단한 Eclipse -> AndroidStudio 포팅법 (0) | 2016.06.08 |
디바이스 사이즈/해상도 가져오기 (Pixel,DPI) (0) | 2015.07.22 |
부팅과 동시에 실행되는 리시버 작성 법 (부트리시버) (0) | 2015.07.22 |
Notify 터치시 현재 실행중 히스토리로 이동하기 (0) | 2015.07.21 |
Comments