글
스레드 객체 및 메소드 내에서 메인 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()와 같이 스레드 실행 함수
}
'개발' 카테고리의 다른 글
[안드로이드]static과 싱글톤 (singleton) from JAVA (0) | 2013.03.14 |
---|---|
[안드로이드]네트워크, 소켓(socket) (0) | 2013.03.13 |
[안드로이드]브로드캐스트 수신자(Broadcast Receiver) (0) | 2013.03.06 |
[안드로이드]선택위젯 (스피너, 그리드뷰, 갤러리) (0) | 2013.03.06 |
[안드로이드]선택 위젯 (0) | 2013.03.06 |
RECENT COMMENT