Mission Completed

asynctask - Android XML thread 본문

개발/Android 개발

asynctask - Android XML thread

삼지안☆ 2013. 6. 27. 14:00

틀이되는 소스이다. 사용할때에는 복사해서 innerClass로 사용할 것을 적극 권장한다.


/** 비동기 처리를 위한 Inner클래스
 *  통신, SQLite 처리 등의 동작을 이 안에서 처리한다. */
public class 클래스이름 extends AsyncTask <Object1, Object2, Object3--> {
	Context context = null;
	
	/** 생성자. 파라미터는 현재 Activity 전달 */
	public 클래스이름(Context p) {
		context = p;
	}
	
	/** 작업 시작시에 화면단에서 보여질 동작
	 * 주로 로딩 다이얼로그를 표시한다. */
	@Override
	protected void onPreExecute() {
		
	}
	
	/** 백그라운드에서 수행될 동작
	 *  통신, SQLite 처리 등의 동작을 이 안에서 처리한다. */
	@Override
	protected Object3 doInBackground(Object1... params) {
		
	}
	
	/** 작업의 중간 결과를 반영하기 위한 처리
	    adapter.add()와 같은 동작을 수행한다.
		이 메서드는 doInBackground 안에서
		this.publishProfess(Object);
		로 호출한다. */
	@Override
	protected void onProgressUpdate(Object2... params) {

	}
	
	/** 작업이 완료된 경우 자동으로 호출된다.
	    주로 로딩 다이얼로그를 닫는다. */
	@Override
	protected void onPostExecute(Object3 result) {

	}
	
	/** 작업이 실패된 경우 호출된다.
	    이 메서드는 doInBackground 안에서
		this.cancel(true);
		라고 호출하면 실행된다.
		주로 에러메시지를 출력하고, 로딩다이얼로그를 닫는다. */
	@Override
	protected void onCancelled() {

	}
}

처리단계: 클래스가 실행이 되면 일단 doInBackground()onPreExecute()가 실행이 된다.
만약 doInBackground()에서 에러가 난다면 this.cancel(this)를 호출 하여 사용자에게 에러를 알리는데, 이때 실제로 실행되어지는 메소드는 onCanceled() 이다.
만약 에러가 나지 않고 끝까지 성공한다면, 무언가를 리턴 하게 된다.
이 리턴값을 받아 처리하는 메소드는 onPostExecute()이다.
여태 객체ArrayList에 결과를 담았다면, 이제는 this.publishProgress( .add했던 값 )을 사용하여 onProgressUpdate()에서 .add()를 사용한다.
자세한 흐름은 맨 아래 그림을 참조하자. 코드에 같아야하는 변수형을 번호로 표현했지만, 그림도 있으니 아래 그림 역시 참조하자.


/** 비동기 처리를 위한 Inner클래스
 *  통신, SQLite 처리 등의 동작을 이 안에서 처리한다. */
public class 클래스이름 extends AsyncTask <Object1, Object2, Object3--> {
	Context context = null;
	
	/** 생성자. 파라미터는 현재 Activity 전달 */
	public 클래스이름(Context p) {
		context = p;
	}
	
	/** 작업 시작시에 화면단에서 보여질 동작
	 * 주로 로딩 다이얼로그를 표시한다. */
	@Override
	protected void onPreExecute() {
		// 로딩창 띄우기
	}
	
	/** 백그라운드에서 수행될 동작
	 *  통신, SQLite 처리 등의 동작을 이 안에서 처리한다. */
	@Override
	protected Object3 doInBackground(Object1... params) {
		// (1) HTTP 통신
		// (1-1) 통신 실패시
		this.cancel(this);
		return null;
		//(2) XML 파서 작업
		try {
			// (2-1) XML처리
			// (2-2) adapter.add(item) 대신, 중간, 결과를 반영
			this.publishProgress(item); //item은 Object2와 같은 변수형이어야 한다.
		}catch(){
			this.cancel(true);
			return null;
		}
		return 100; // 이 값은 onPostExecute로 들어간다.
	}
	
	/** 작업의 중간 결과를 반영하기 위한 처리
	    adapter.add()와 같은 동작을 수행한다.
		이 메서드는 doInBackground 안에서
		this.publishProfess(Object);
		로 호출한다. */
	@Override
	protected void onProgressUpdate(Object2... params) {
		// (2-3) 리스트에 데이터 반영
		adapter.add(params[]);
	}
	
	/** 작업이 완료된 경우 자동으로 호출된다.
	    주로 로딩 다이얼로그를 닫는다. */
	@Override
	protected void onPostExecute(Object3 result) {
		// 로딩창 닫기 + 작업이 성공되었음을 자용자에게 알림

	}
	
	/** 작업이 실패된 경우 호출된다.
	    이 메서드는 doInBackground 안에서
		this.cancel(true);
		라고 호출하면 실행된다.
		주로 에러메시지를 출력하고, 로딩다이얼로그를 닫는다. */
	@Override
	protected void onCancelled() {
		// 로딩창 닫기 + 작업이 성공되었음을 자용자에게 알림

	}
}



'개발 > Android 개발' 카테고리의 다른 글

Android Google맵 필기자료  (0) 2013.07.05
Android ImageDownloader  (0) 2013.06.28
Android with SQLite  (0) 2013.06.26
Activity Life Cycle  (0) 2013.06.24
Android Log 찍는 법  (0) 2013.06.05