1. API16(젤리빈) 미만 버전에서는 AsyncTask 선언을 UI Thread에서 해주지 않으면 오류가 발생한다.

    해결방법 : Activity나 Application 등 UI스레드 아래와 같이 AsyncTask를 한번 호출합니다.

     Class.forName("android.os.AsyncTask");

 

 2. API 16 이상(JELLY BEAN)의 버전에서는 자유롭게 사용해도 된다.

 

 3. excutes(Params)는 UI 스레드에서 직접호출해야합니다

 

 4. Task는 오직 한번만 실행될 수 있습니다.

 

 5. 구현한 액티비티 종료 시 별도의 지시가 없다면 종료되지 않습니다.

 

 6. 하나의 객체이므로 재사용이 불가능합니다. (객체를 새롭게 생성하면 되지만 메모리 효율 나빠짐)

 

 7. AsyncTask 는 순차적으로 하나의 스레드에서 실행되었으나, 도넛의 시작과 함께 병렬 처리 가능한      

    스레드 풀로 바뀌었다. 허니콤의 시작과 함께 병렬 처리의 에러를 피하기 위해 다시 싱글 스레드로   

    실행되게 되었다. 만약 당신이 병렬 처리를 원한다면     

    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 처럼 사용할 수 있다.

'안드로이드 > AsyncTask' 카테고리의 다른 글

AsyncTask(2)  (0) 2017.04.05

메인Thread

안드로이드의 애플리케이션을 실행하면 시스템은 메인 액티비티를 메모리로 올려 프로세스로 만들며, 이 때 메인 스레드가 자동으로 생성됩니다. 메인 스레드는 안드로이드의 주요 컴퍼넌트를 실행하는 곳이자 UI를 그리거나 갱신하는 일을 담당할 수 있는 유일한 스레드이므로 UI 스레드라고도 불립니다.




AsyncTask는 UI 처리 및 Background 작업 등 을 하나의 클래스에서 작업 할 수 있게 지원해 줍니다. 쉽게말해 메인Thread와 일반Thread를 가지고 Handler를 사용하여 핸들링하지 않아도 AsyncTask 객체하나로 편하게 UI를 수정 할 수 있고, Background 작업을 진행 할 수 있다.


일반Thread에서 UI 객체에 직접 접근할 수 없기 때문에 핸들러를 사용하지만 핸들러를 사용하면 코드를 복잡하게 만드는 문제가 생긴다.


백그라운드 작업을 좀더 간단하게 AsyncTask 클래스를 사용할 수 있다. AsyncTask  객체를 만들고 execute() 메소드를 실행하면 이 객체는 정의된 백그라운드 작업을 수행하고 그결과를 메인 스레드에서 실행하기떄문에 UI객체에 접근하는데 문제가 없다.



1. onPreExecute() : Background 작업 시작전에 UI 작업을 진행 한다.

 @Override 
 protected void onPreExecute() {
       super.onPreExecute(); 
 }


2. doInBackground() : Background 작업을 진행 한다.

 @Override 
 protected String doInBackground(String... params) {
       super.onPreExecute(); 
 }


3. onPostExecute() : Background 작업이 끝난 후 UI 작업을 진행 한다.

 @Override 
 protected void onPostExecute(String result) {
       super.onPreExecute(); 
 }




[onPreExecute()] -> [doInBackground()] -> [onPostExecute()] 순서




onPreExecute( ), onProgressUpadate( ), onPostExecute( ) 메소드는 메인 스레드에서 실행되므로 UI 객체에 자유롭게 접근할 수 있다


'안드로이드 > AsyncTask' 카테고리의 다른 글

AsyncTask(1)  (0) 2017.08.18

+ Recent posts