http://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-Timer-%EC%99%80-TimerTask%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-IntroActivity-%EA%B5%AC%EC%84%B1



안드로이드 화면구성을 할 때, 가장 먼저 구현해야하는 화면이 바로 Intro 화면 일 것 입니다. Intro 화면이란 현재 실행되는 어플의 첫 화면이 보여지는 화면을 말하는데요, 말 그대로 해당 어플의 성격과 컨셉을 대변해 주는 아주 중요한 화면 입니다.


이렇게 Intro 화면을 보여주고, 실제 Main 화면으로 이동할 경우, 보통의 경우 Handler에 
postDelayed(Runnable r , long delayMillis) 란 메서드를 활용 하는데요. Handler를 사용한 방법 말고도 Timer와 TimerTask를 이용하여 화면을 이동 할 수 가 있습니다.


자 그럼 우선, Handler를 이용한 화면 전환 부터 확인해 볼까요?

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
31
32
33
34
35
36
37
38
package arabiannight.tistory.com;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
 
public class TestHandlerActivity extends Activity {
     
    private Handler mHandler;
    private Runnable mRunnable;
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         
        mRunnable = new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext()
                        , ResultPage.class);
                startActivity(intent);
            }
        };
         
        mHandler = new Handler();
        mHandler.postDelayed(mRunnable, 5000);
         
    }
     
    @Override
    protected void onDestroy() {
        Log.i("test", "onDstory()");
        mHandler.removeCallbacks(mRunnable);
        super.onDestroy();
    }
}


우선 Runnable 객체를 만들 후 에, Handler의 
 postDelayed(Runnable r , long delayMillis) 메서드를 사용해서 화면을 전환 하는 방법 입니다.
 
 postDelayed(Runnable r , long delayMillis) 

 "런어블객체(Runnable) 를  delayMillis 시간 후에 실행 해라. 라는 메서드 입니다.
위의 코드에서는 5000 을 주었으니 ( 시스템시간/1000 = 현재시간 ) 
5초후( 5000/1000 ) 에 실행하게 됩니다. 
 
 


그리고 onDestroy() 메서드에서 removeCallBacks(Runnable r) 을 해 준 것은, 어플리케이션이 종료되어도 실제 onDestory() 메서드가 호출 되어도, 메모리 상에서 Handler가 PostDelayed 메서드를 실행시켜 어플리케이션이 다시 실행되는 경우를 막기 위해서 입니다. 항상 어플리케이션이 종료될 경우를 대비 해서 
removeCallBacks(Runnable r) 를 호출해 주는게 바람직 합니다.
 
 removeCallBacks(Runnable r) 
런어블(Runnable)을 제거 한다. 
 
 




자 그럼 Timer와 TimerTask에 대해서 알아 보겠습니다. Timer는 간단하게 스케쥴을 관리 해주는 클래스인데요. 간단한 시간이나 반복적인 시간에 대해 컨트롤 하고 싶을 때 사용하는 클래스 입니다. 각각의 Timer는 각각의 스레드를 가지고 작업을 하고 있기 때문에 시간관리를 위해 만들어진 Thread라고 생각하시면 됩니다.

TimerTask란 Timer가 스케쥴을 관리하기 위해 사용하는 "작업" 이라고 생각하시면 되는데요. 위의 예제에서 Runnable의 역할이라고 생각 하시면 쉽습니다. 즉, Timer는 TimerTask를 가지고 스케쥴을 관리하고 있습니다.

자 그럼 Timer와 TimerTask의 활용 예제를 만나 보실까요?
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
31
32
33
34
35
36
37
38
39
40
41
42
package arabiannight.tistory.com;
 
import java.util.Timer;
import java.util.TimerTask;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
 
public class TestTimerTaskActivity extends Activity {
     
    private TimerTask mTask;
    private Timer mTimer;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        mTask = new TimerTask() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext()
                        , ResultPage.class);
                startActivity(intent);
            }
        };
         
        mTimer = new Timer();
         
        mTimer.schedule(mTask, 5000);
//      mTimer.schedule(mTask, 3000, 5000);
    }
     
    @Override
    protected void onDestroy() {
        Log.i("test", "onDstory()");
        mTimer.cancel();
        super.onDestroy();
    }
}


Timer를 활용한 예제를 만나 봤는데요, Timer 역시 간단하게 코딩 할 수 있습니다. 또한 Handler와 굉장히 유사한 방법으로 코딩을 하게 됩니다. 어떻게 보면 메서드 명만 다르지 완전 같은 함수로 보이기도 합니다.ㅎㅎ


그럼 Timer함수에 대해 알아보겠는데요, schedule(TimerTask task , long delay) 이란 함수를 유심히 보시면 됩니다. ㅎ 이 것 또한 Handler의  postDelayed() 란 메서드와 유사한 기능을 가지고 있습니다.
 

 schedule(TimerTask task , long delay) 
"TimerTask를 delay 시간 만큼 후에 실행 시켜라." 라는 메서드 입니다.
만약 delay를 3초를 지정해 주면,  " 3초 후에 Task를 한번만 실행 해라. "  라는 메서드가 됩니다.

schedule(TimerTask task , long delay , long period)  
그리고, 매개인자가 3개인  schedule 함수가 있는데요, 이 함수의 기능은,  
 

"TimerTask를 delay 시간 만큼 후에 실행 시키고, period만큼 후에 계속 반복 해라." 라는 메서드 입니다. 만약delay와 3초와 period 5초를 지정해 주면, " 3초 후에 Task를 실행하고 5초마다 반복 해라. " 라는 메서드가 되는 것 입니다.
 
 
 

  
ㅎㅎ 정말 비슷하네요. 그리고 onDestroy() 메서드에서는 Handler의 
removeCallBacks () 메서드와 같은 기능을 하는cancel() 메서드를 사용 하였습니다. 마찬가지로 어플리케이션 종료 시에는 Timer의 작업을 취소 해주어야 겠죠?ㅎ
 
 mTimer.cancel()
타이머의 모든 작업(TimerTask)를 취소 합니다. 
 
 



테스트 파일 입니다.

 TestTimerTask.zip










저작자 표시 비영리 변경 금지

  1. 미니잉리
    친절한 설명 감사합니다 !! 많은 도움을 받았어요 !!!!
  2. 좋은글
    좋은글 감사합니다.