스레드 객체 및 메소드 내에서 메인 UI객체에 접근할수 없다!

그래서 핸들러가 필요하다.

Thread 내에서 Handler 객체를 이용하여 UI 객체와 값을 주고 받는다.

class ProgressHandler extends Handler{

   public void handleMessage(Message msg){ //handler를 통해 UI로 부터 값을 수신하는 메소드. (핵심)

      mytext.settext(msg.what);

   }

}

그리고 Activity쪽에서는 아래와 같이 쓰면 된다.

Thread thread = new Thread(new Runnable(){

   public void run() {

      Message msg = handler.obtainMessage(); // new로 매번 객체를 매번 만드는 대신 handler에게 msg달라고 요청

      msg.arg1 = '1111';

      msg.arg2 = '222';

      msg.object = Object;

      Message msg = Message.obtain(handler, '1111', '222', Object); // 또는 이렇게 한줄로 처리할수도 있다.

     //메세지에 값을 담아서 넘겨준다.

     handler.sendMessage(msg); // msg전송 handler객체의 handleMessage() 메소드가 호출된다

   }

}

 

루퍼: 무한루프 방식을 이용해 메시지 큐에 들어오는 메시지를 지속적으로 보면서 하나씩 실행

 

AsyncTask

백그라운드 작업을 좀 더 쉽고 간단하게 할 경우

AsyncTask 객체를 만들고 execute() 메소드를 실행하면 이 객체는 정의된 백그라운드 작업을 수행하고, 필요한 경우에 그 결과를 메인 스레드에서 실행하므로 UI 객체에 접근 하는데 문제 없게 됨

 

doInBackground

새로만든 스레드에서 백그라운드 작업 수행

execute()메소드를 호출할 때 사용된 파라미터를 배열로 전달받음

 

onPreExecute

백그라운드 작업 수행 전 호출

메인 스레드에서 실행되며 초기화 작업에 사용

 

onProgressUpdate

백그라운드 작업 진행 상태를 표시하기 위해 호출

작업 수행 중간 중간에 UI객체에 접근하는 경우 사용

이 메소드가 호출되도록 하려면 백그라운드 작업 중간에 publishProgress()메소드 호출

 

onPostExecute

백그라운드 작업이 끝난 후 호출

메인 스레드에서 실행되며 메모리 리소스를 해제하는 등의 작업에 사용

백그라운드 작업의 결과는 Result타입의 파라미터로 전달

 

class ProcessTask extends AsyncTask{

   doInBackground() //스레드 run()함수처럼 실행부분

   publicshProgress() //호출하면 onProgressUpdate()가 호출된다. (스레드에서 .start()하면 run()실행되는것 처럼)

   onProgressUpdate() //이 안에서 메인UI접근가능

   execute() //.start()와 같이 스레드 실행 함수

}

by wisegirl 2013. 3. 11. 22:28