Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

Dev.

간단한 AsyncTask 구현 법 (외부쓰레드) 본문

Android

간단한 AsyncTask 구현 법 (외부쓰레드)

Pppdw 2015. 7. 22. 18:49

작업을 하다보면 메인 쓰레드에서의 작업을 피해야 할 경우가 생긴다.

예를 들면 다수의 비트맵파일을 로드해야하는 경우나, 사이즈가 상당히 큰 파일을 로드해야 할 때.

안드로이드는 기본적으로 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문을 보면된다..
//딱히 아이디값 같은게 필요없으면 신경쓰지않아도 된다.
Comments