본문 바로가기

[Proramming]/Android

[Android] Thread 테스트 - 타이머 만들기

[Android] Thread 테스트 - 타이머 만들기

Thread를 이용하면 일정 주기로 특정한 처리를 할 수 있는 프로그램을 할 수 있다.
예를 들어 외부에 연결된 스위치를 감시 하거나, 0.1 초 주기로 센서 데이터를 읽어오거나,  TCP/IP 에서 들어온 데이터를 수신 하는등의 일을 처리 할 수 있다.

Thread 시작 함수 생성
Thread클래스를 이용하여 새로운 Thread를 생성하고 run() 함수를 재정의 해 주면 된다.

Thread 생성 방법 두가지

1) Thread 클래스를 상속받아 새로운 클래스 생성하여 run() 함수를 재정의하고 start() 함수 호출

ex) class myThread extends Thread
{
    public void run()
   {
        "   "
   }
}

myThread my_thread = new myThread();
my_rhread.start();

 

2)Runnable 인터페이스를 구현한 클래스를 만들어 run()함수를 정의 (Runnable 객체는 다른 클래스를 상속할 수 있으므로 보다 유연한다.)

ex) class myThread implements Runnable
{
    public void run()
   {
        "   "
   }
}

Thread my_thread = new Thread(new myThread());
my_rhread.start();

 


예를 들면 스위치 눌렀을 때 Thread1Start()함수를 실행하면 Thread 생성해서 동작하게 된다.
Thread에서 sleep(), wait(), yeild() 등의 함수를 호출하면 InterruptedException 이 발생할 수 있으므로 반드시 예외 처리를 해 주어야 한다.

    private void Thread1Start()
   {
        new Thread() {
            @Override
            public void run()
            {
             Timer1Process();
            }
        }.start();
    }
   
    //주기적으로 실행될 프로그램
    private void Timer1Process()
    {
     int i = 0;
        // 0.1초에 한번씩 데이터 증가
        while(true)
        {
            try
            {
               //메세지(데이터) 전송
                handler.sendEmptyMessage(i++);
                Thread.sleep(100);
            }
            catch (InterruptedException e)
            {
            }
        }
    }




메시지 처리 함수
Thread 코드 내에서는 위젯사용을 할수 없는데 이를 해결하기 위해 메시지 핸들러를 이용한다.
Thread코드 내부에서는 위젯처리할 내용에 대한 메시지만 등록하고 처리는 Handler에서 받아서 처리하면 된다.
예를 들어 아래와 같이 TextView에 증가된 출력 할 수 있다.

    //메시지 처리 함수
    Handler handler = new Handler()
    {
        public void handleMessage(Message msg)
        {
                  ctlText1.setText("" + msg.what);
        };
    };


아래와 같이 import가 필요하다.
import android.os.Handler;
import android.os.Message;



ProgressBar를 이용하여 0.1초 간격으로 증가하는 프로그램
        ctlProcessBar1 = (ProgressBar)findViewById(R.id.progressBar1);
       
        ctlProcessBar1.setMax(100);
        ctlProcessBar1.setProgress(0);

    Handler handler = new Handler()
    {
        public void handleMessage(Message msg)
        {
         ctlText1.setText("" + msg.what);
         
         ctlProcessBar1.incrementProgressBy(2);
         ctlProcessBar1.setProgress(msg.what%100);
        };
    };


반응형