관리 메뉴

드럼치는 프로그래머

[안드로이드] 스레드와 핸들러 본문

★─Programing/☆─Android

[안드로이드] 스레드와 핸들러

드럼치는한동이 2012. 3. 15. 19:14

핸들러...

 

간단한 예제를 만들며 시작해 보자..

 

?main.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/tv"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:textSize="50dp"
  android:text="Android"
  />
 <Button
  android:id="@+id/bt_Start"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="시작"
  />
 <Button
  android:id="@+id/bt_Clear"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="지우기"
  />
</LinearLayout>

 

 

MainActivity.java

 

package com.test.ThreadTest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener {
 /** Called when the activity is first created. */
 TextView tv1;
 MyThread1 tr1=new MyThread1();
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button bt1 = (Button) findViewById(R.id.bt_Start);
  Button bt2 = (Button) findViewById(R.id.bt_Clear);
  bt1.setOnClickListener(this);
  bt2.setOnClickListener(this);
  tv1 = (TextView) findViewById(R.id.tv);
 }

 @Override
 public void onClick(View arg0) {//버튼이 클릭 되었을때
  
  if (arg0.getId() == R.id.bt_Start) {//만약 bt_Start버튼이 클릭 되면
   tr1.start();                     //스레드가 시작 된다.
  } else if (arg0.getId() == R.id.bt_Clear) {//만약 bt_Clear이 클릭되면
   tv1.setText(" ");                                 //tv1의 문자열을 공백으로 채운다.
  }
 }
 

 Handler handler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   tv1.setText(""+msg.what);
  };
 };
 class MyThread1 extends Thread{//스래드 클래스의 정의
  @Override
  public void run() {//run메소드의 재정의
   super.run();
   for(int i=0;i<100;i++){
    handler.sendEmptyMessage(i);//핸들러에 메시지 보낸다.
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   
  }
  
 }

}

응용 프로그램등의 프로그램들은 스레드가 반드시 존재 한다.

스레드를 별도로 만들어 주지 않아도 기본적으로 만들어지는 응용 프로그램에는 메인 스레드가 존재 하는데

그 메인 스레드는 안드로이드 에서는 임으로 접근 할수 없다. 메인 스레드 외에 별도의 서브 스레드는 메인 스레드가 관리 하고 있는 메시지 큐에 메시지를 전달 해서 메인 스레드가 이를 처리 하게 해야 접근 할 수 있다..

 

위의 내용을 보기 쉽게 그림으로 바꾸면 아래와 같다..

 

(순서가 꼭 이렇게 되어야 한다는건 아닌데 쉽게 표현 하고자 순서도로 표현했다)

 

android.os.Handler클래스의 메시지 전달 메소드는 아래와 같다..

 

 final boolean

 sendEmptyMessage(int What)

what값만을 포함하는 메시지를 전달 한다.

 final boolean

sendEmptyMessageAtTime(int what,long uptimeMillis)

 what값만을 포함하는 메시지를 uptimeMills 시간에 전달한다.

 final boolean

 sendEmptyMessageDelayed(int what, long delatMills)

what 값만을 포함하는 메시지를delatMills시간 뒤에 전달한다. 

 final boolean

 sendMessage(Message msg)

메시지큐 뒤에 메시지를 추가 한다. 

 final boolean

 sendMessageAtFrontofQueue(Message msg)

 메시지큐 앞에 메시지를 추가 한다. 

 boolean

 sendMessageAtTime(Message msg, long uptimeMills)

 메시지를 uptimeMills 시간에 전달한다.

 final boolean

 sendMessageDelayed(Message msg, long delayMills)

 메시지를 현재 시간부터 delyedMills시간이 지난 후에 메시지 큐에 추가한다.

Comments