- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[안드로이드] 안드로이드의 스레드(Thread) - C. 루퍼(Looper) 본문
메시지 큐(Message Queue)
메시지는 스레드 간의 신호입니다. 이는 메서드처럼 호출한다고 바로 실행되는 것이 아니라 순서대로 처리가 됩니다. 자료구조에서 배우는 큐를 사용한다고 보시면 됩니다. 메시지를 쌓아 두는 공간이 바로 메시지 큐입니다.
루퍼(Looper)
루퍼는 메시지 큐에서 메시지를 꺼내어 핸들러로 전달하는 작업을 수행합니다.
앞서 말했듯이 메인 스레드의 경우 기본적으로 루퍼를 가집니다.
하지만 일반 작업을 수행하는 스레드의 경우 기본적으로 루퍼를 가지지 않습니다.
만약 이런 스레드가 메시지를 받아야 할 경우 루퍼를 직접 생성시켜야 합니다.
루퍼의 생성과 확인
루퍼를 직접 생성하기 위해서는 다음의 메서드를 호출합니다.
static void prepare()
현재 스레드를 위한 루퍼를 준비합니다.
static void loop()
큐에서 메시지를 꺼내 핸들러로 전달하는 루프를 실행합니다.
void quit()
루프를 종료시킵니다.
그래서 어느 루퍼가 어느 스레드와 연결되어 있는지 알기 위해서는 아래의 메서드들을 사용합니다.
Thread getThread()
루퍼와 연결된 스레드를 구합니다.
static Looper getMainLooper()
주 스레드의 루퍼를 구합니다.
static Looper myLooper()
현재 스레드의 루퍼를 구한다. 루퍼가 없을 경우 null이 리턴됩니다.
루퍼 사용 예제
public class LooperTest extends Activity {
int mMainValue = 0;
TextView mMainText;
TextView mBackText;
EditText mNumEdit;
CalcThread mThread;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.thread_loopertest);
mMainText = (TextView)findViewById(R.id.mainvalue);
mBackText = (TextView)findViewById(R.id.backvalue);
mNumEdit = (EditText)findViewById(R.id.number);
Button btn = (Button)findViewById(R.id.increase);
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
mMainValue++;
mMainText.setText("MainValue : " + mMainValue);
}
});
btn = (Button)findViewById(R.id.square);
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
Message msg = Message.obtain();
msg.what = 0;
msg.arg1 = Integer.parseInt(mNumEdit.getText().toString());
mThread.mBackHandler.sendMessage(msg);
}
});
btn = (Button)findViewById(R.id.root);
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
Message msg = Message.obtain();
msg.what = 1;
msg.arg1 = Integer.parseInt(mNumEdit.getText().toString());
mThread.mBackHandler.sendMessage(msg);
}
});
mThread = new CalcThread(mHandler);
mThread.setDaemon(true);
mThread.start();
}
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
mBackText.setText("Square Result : " + msg.arg1);
break;
case 1:
mBackText.setText("Root Result : " + ((Double)msg.obj).doubleValue());
break;
}
}
};
}
class CalcThread extends Thread {
Handler mMainHandler;
CalcThread(Handler handler) {
mMainHandler = handler;
}
//루퍼의 생성
public void run() {
Looper.prepare();
Looper.loop();
}
public Handler mBackHandler = new Handler() {
public void handleMessage(Message msg) {
Message retmsg = Message.obtain();
switch (msg.what) {
case 0:
try { Thread.sleep(100); } catch (InterruptedException e) {;}
retmsg.what = 0;
retmsg.arg1 = msg.arg1 * msg.arg1;
break;
case 1:
try { Thread.sleep(100); } catch (InterruptedException e) {;}
retmsg.what = 1;
retmsg.obj = new Double(Math.sqrt((double)msg.arg1));
break;
}
mMainHandler.sendMessage(retmsg);
}
};
}
XML
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/mainvalue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="MainValue : 0" />
<Button android:id="@+id/increase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Increase" />
<EditText android:id="@+id/number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numeric="integer" android:text="5" />
<TextView android:id="@+id/backvalue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="BackValue : 0" />
<Button android:id="@+id/square"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Square" />
<Button android:id="@+id/root"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Root" />
</LinearLayout>
[출처] 안드로이드의 스레드(Thread) - C. 루퍼(Looper)|작성자 녹차
'★─Programing > ☆─Android' 카테고리의 다른 글
[안드로이드] 충돌검사 & VIew 에서 키보드 이벤트 받기 설정 (0) | 2011.11.03 |
---|---|
[안드로이드] 안드로이드 토스트 (Toast) (0) | 2011.11.03 |
[안드로이드] 안드로이드의 스레드(Thread) - B. 핸들러 (0) | 2011.11.03 |
[안드로이드] 안드로이드의 스레드(Thread) - A. 스레드 (0) | 2011.11.03 |
[안드로이드] 안드로이드 핵심, 액티비티(Activity) (0) | 2011.11.03 |