퍼온 자료

android 안드로이드 타이머

ITSkeleton 2020. 6. 19. 19:21
728x90
반응형

http://blog.naver.com/PostView.nhn?blogId=coalbin1&logNo=30100764207

ame/Music Application에서 구현하기 위한 timer를 구현해보고 있습니다.

쉽게 말하면 드럼머신 같은 건데요.
1ms 단위로 정확히 타이머가 작동하면 됩니다.

총 세가지 방법을 시도해보았으나 만족스럽지 않습니다.

1. Timer, TimerTask를 사용한 방법

TimerTask myTask = new TimerTask() {
    public void run() {
        Log.d("myTask", "run()");
    }
};
Timer timer = new Timer();
//timer.schedule(myTask, 5000);  // 5초후 실행하고 종료
timer.schedule(myTask, 5000, 3000); // 5초후 첫실행, 3초마다 계속실행

2. CountDownTimer를 이용한 방법
       new CountDownTimer( 100, 100 ){
                       @Override
                       public void onFinish() {
                       imgLamp.setImageResource(R.drawable.lamp);
                       }

                       @Override
                       public void onTick(long millisUntilFinished) {
                               // TODO Auto-generated method stub
                       }
       }.start();



3. handler를 이용한 방법
http://www.androidpub.com/4374

Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
   //Do Something
}, 3000);

위 세가지 방법 모두 정확한 간격으로 타이머가 울리지 않습니다.
간격 테스트는 mp3파일 작은 것 하나를 타이머발생시 울리도록 하였습니다.

혹시...
Windows PC 또는 iPhone 급의 1ms 단위의 타이머 발생을 어떻게 하는 지
아시는 분이 계실지요?

감사합니다. ^^


 
 
 

처음 Windows 운영체제에서 개발언어를 익혔을때 가장 매력적인 기능이 바로 타이머(Timer) 였습니다. 개발자가 지정한 시간 간격으로 자동으로 알아서 어떤 로직을 호출해서 실행시켜 주는 것이 마치... 컴퓨터에게 일을 맡겨 놓고 나는 신경끄고 놀수있다라는 가능성이 매력적이였나 봅니다.

그러나..... 실제 지금까지 개발 현장에서 단한번도 이 타이머를 사용해 본적은 없습니다. 이유는.. 정확도가 떨어지기 때문입니다. 그러니깐... 예를 들어 1초 간격으로 실행해라고 지정해 놓지만.. 정확히 1초 마다가 아니라 경우에 따라 큰 오차가 발생하기 때문입니다..

여하튼... 이런 저런 사정을 떠나... 안드로이드에도 타이머 기능이 존재하는데.. 이 타이머 기능에 대해 정리를 해 보았습니다. 매우 정확한 시간으로 어떤 일을 반복적으로 수행해야할 경우에는 사용하기에는 부적합하지만... 그래도 어떤 일을 주기적으로 반복해서 수행해야할 경우에 매우 요긴하게 사용할 수 있는.. 매우 손쉬운 기능이 바로 이 타이머이기 때문입니다..

정리하는 수준으로 글을 전개해 나갈 것이며 타이머에 대한 예제 코드가 매우 단순하기 때문에 바로 코드 나갑니다!

view plaincopy to clipboardprint?

  1. package mobile.geoservice;  
  2.   
  3. import android.app.*;  
  4. import android.os.*;  
  5. import android.view.*;  
  6. import android.widget.*;  
  7.   
  8. public class Timer extends Activity {  
  9.     private TextView _text;  
  10.     private CountDownTimer _timer;  
  11.    
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.timerlayout);  
  15.     
  16.         _text = (TextView)findViewById(R.id.tvMsg);  
  17.     
  18.         _timer = new CountDownTimer(10 * 1000, 1000) {  
  19.             public void onTick(long millisUntilFinished) {  
  20.                 _text.setText("value = " + millisUntilFinished);  
  21.             }  
  22.      
  23.             public void onFinish() {  
  24.                 _text.setText("finshed");  
  25.             }  
  26.         };  
  27.   
  28.         Button btnStart = (Button)findViewById(R.id.btnStart);  
  29.         btnStart.setOnClickListener(new Button.OnClickListener() {  
  30.             public void onClick(View v) {  
  31.                 _timer.start();  
  32.             }  
  33.         });  
  34.     
  35.         Button btnEnd = (Button)findViewById(R.id.btnStop);  
  36.         btnEnd.setOnClickListener(new Button.OnClickListener() {  
  37.             public void onClick(View v) {  
  38.                 _timer.cancel();  
  39.             }  
  40.         });    
  41.     }  
  42. }  
10 번 코드가 바로 타이머를 위한 클래스로 CountDownTimer입니다. 18번 코드에서 생성하고 있는데... 다른 여느 타이머와는 다르게 반복될 시간 간격뿐만 아니라 작동될 시간까지도 지정합니다. 즉, 생성자에게 2개의 인자를 받는데 첫번째가 작동될 시간이며 두번째가 시간 간격입니다. 위의 경우 첫번째 인자값이 10*1000이므로 10초동안 수행되며, 두번째 인자가 1000이므로 1초 간격으로 수행됩니다. 19번 코드와 23번 코드에 나타난 onTick과 onFinish는 각각 타이머 수행 코드에 대핸 매서드와 타이머가 지정된 시간(여기서는 10초)이 되었을때 발생되는 매서드입니다.

이렇게 만든 타이머의 start 매서드와 cancel 매서드를 통해 시작시키거나 작동을 중지시킬 수 있습니다. cancel 매서드의 경우 여타 다른 환경의 타이머와 다르게 취소만 될뿐.. 중지하여 중지된 시점으로부터 재개할 수는 없습니다. 또한 확인해 본바로는 cancel 매서드를 onTick 매서드 안에서 호출할 경우 의도와 다르게 타이머가 중지하지 않습니다..

이해를 돕고자 위의 코드를 실행했을 경우 애뮬레이터에서 나타나는 UI는 아래 그림과 같습니다.

 

모바일에서 타이머의 기능을 어디에 활용할 수 있을까... 한번 생각을 해보면... 일정한 시간 간격으로 자신의 위치를 얻어오거나... 일정한 시간 간격으로 메일서버로부터 메일을 확인한다거나... 오히려 일반 데스크탑 환경에서보다 모바일에서 타이머의 기능은 매우 중요할듯합니다..

아뿔싸~ 레이아웃 리소스가 빠졌군요~! 실습을 하시는 분이라면 timerlayout.xml이라는 파일로해서 저장해주시면 됩니다.

view plaincopy to clipboardprint?

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"  
  3.     a:orientation="vertical"  
  4.     a:layout_width="fill_parent"  
  5.     a:layout_height="fill_parent"  
  6.     a:gravity="center">  
  7.   
  8. <TextView    
  9.  a:id="@+id/tvMsg"  
  10.     a:layout_width="fill_parent"   
  11.     a:layout_height="wrap_content"   
  12.     a:text="타이머 정보"  
  13.     a:gravity="center"  
  14.     />  
  15.   
  16. <Button  
  17.  a:id="@+id/btnStart"  
  18.  a:layout_width="wrap_content"  
  19.  a:layout_height="wrap_content"  
  20.  a:text="start Timer"  
  21.  />      
  22.   
  23. <Button  
  24.  a:id="@+id/btnStop"  
  25.  a:layout_width="wrap_content"  
  26.  a:layout_height="wrap_content"  
  27.  a:text="stop Timer"  
  28.  />  
  29. </LinearLayout>  

출처 : http://hiiq.egloos.com/1845943

private TimerTask second;

private TextView timer_text;

private final Handler handler = new Handler();

 

public void testStart() {

timer_text = (TextView) findViewById(R.id.timer);

timer_sec = 0;

count = 0;

 

second = new TimerTask() {

 

@Override

public void run() {

Log.i("Test", "Timer start");

Update();

timer_sec++;

}

};

Timer timer = new Timer();

timer.schedule(second, 0, 1000);

}

 

protected void Update() {

Runnable updater = new Runnable() {

public void run() {

timer_text.setText(timer_sec + "초");

}

};

handler.post(updater);

}

 

원하는 곳에서 testStart() 함수를 호출하면 된다.


출처: http://mainia.tistory.com/603

이번에는 안드로이드에서 타이머 구현 방법에 대해 언급할려고 한다.

쓰임세는 다양하다. 게임에서 시계표시를 할수 있고 타이머 관련

구현도 가능하며 시간 간격에 맞게 어떤 작업을 수행하고자

할때도 쓰일것이다. 그래서 한번은 정리할 필요가 있었다.

 

(1) java 에서 주로 쓰는 방법

 

안드로이드는 java를 기반으로 하기 때문에 java 에서 사용하는

타이머 구현 방법을 떠올릴 것이다.

Java 에서 구현하는 방법은 여러가지가 있는데 그 첫번째는

스레드를 이용하는 것이다.

추상클래스인 Runnable 를 상속받던지 아니면 Thread 클래스를

생성해서 run 함수를 구현하는데 그 속에 일정한 간격으로

루프를 돌수 있도록 구현 하면 된다.

 

private final class SwapViews implements Runnable {

    private final int mPosition;

 

    public SwapViews(int position) {

        mPosition = position;

    }

 

    public void run() {

        // 기능구현

          

           Thread.sleep(1000);// 1초의 정지

    }

}

 

// 위 클래스 사용

SwapViews swapViews = new SwapView(0);

swapViews.start();

 

두번째는 Timer 를 이용하는 방법이다.

Timer 클래스는 시간관리를 위해 만들어진 클래스 이므로

이것이 타이머 관리를 위해 더 적절한 방법일지도 모르겠다.

그리고 구현하기도 쉽다. 파라미터로 몇 개의 값만 넘기면

되기 때문이다.

예제를 보게 되면 첫번쨰 파라미터는 작업을 수행할 TimerTask

클래스 객체를 만들어 넣으면 된다. 그속에 run 함수는 필수로

구현 해야되며 run 에 있는 내용이 설정한 시간 간격에 맞게

수행이 되는것이다.

그리고 두번쨰는 run 이 실행되고 종료 시간을 나타낸다.

두번째 파라미터만 넣게 되면 한번으로 끝나지만 세번째 파라미터를

넣게 되면 넣은 값만큼의 간격으로 반복하게 되는것이다.

 

TimerTask task = new TimerTask(){

public void run() {

           try {

              mainTime++;

              int min = mainTime / 60;

              int sec = mainTime % 60;

              String strTime = String.format("%s : %s", min, sec);

          

              //Thread.sleep(1000);

           } catch (Exception e) {

              e.printStackTrace();

           }

}

};

Timer mTimer = new Timer();

mTimer.schedule(task, 1000, 1000);

// 3초후 run을 실행하고 종료 timer.schedule(task, 3000);

// 10초후 run을 실행하고 매3초마다 실행 timer.schedule(task, 10000, 3000);

 

(2) android 에서 Handler 을 이용한 방법

 

위의 두가지 방법은 java 에서 흔히 구현하는 방법이고 안드로이드에서는

또 다른 방법이있다. 굳이 그 방법을 소개 할려는 것은 위의 방법으로는

내부적으로 수행하는 기능은 구현할지 모르겠지만 화면상에 실시간으로

시간값을 변경해야 한다던지 시계가 움직이는 애니메이션 같은 것을

구현하고자 한다면 아래에 소개한 방법으로 해야 되기 때문이다.

그것은 android.os.Handler 클래스를 이용하는 것인데 백그라운드

메시지를 전달할때도 쓰이는데 이것을 sendEmptyMessageDelayed  함수를

이용해 일정한 간격으로 계속 반복해서 보냄으로서 시계역활을 할수 있게 된다.

구현은 android.os.Handler 클래스 객체를 정의한다.

그리고 필수 함수인 handleMessage 를 구현한다. handlerMessage 함수내부에는

sendEmptyMessageDelayed 함수를 실행해야 한다. 그래야 반복적으로

수행이 될것이다. 이 함수의 두번째 파라미터로 시간이 들어가게 되는데

반복하고자 하는 시간을 넣으면 된다.

 

mHandler = new Handler(){

   public void handleMessage(Message msg){

           super.handleMessage(msg);

          

           /** 초시간을 잰다 */

           int div = msg.what;

                    

           int min = mainTime / 60;

           int sec = mainTime % 60;

           String strTime = String.format("%02d : %02d", min, sec);

                    

 

           this.sendEmptyMessageDelayed(0, 1000);

           mTimeView.setText(strTime);

           mTimeView.invalidate();

           mainTime++;

          

   }

};

 

이렇게 정의를 했으니 이것을 사용해야 하는데 처음 시작하고자 하는 곳에

mHandler.sendEmptyMessage(1); 함수를 실행하면 된다. 파라미터로 넘어가는

1 의 값은 핸들의 구분자이다. 여러 개의 기능을 사용하고자 할 때 파라미터

값을 바꾸고 handleMessage 로 넘어온 Message  what 변수로 구분하게 된다.

위의 int div = msg.what  sendEmptyMessage 의 파라미터로 넘어간 값을

가져오게 되는 것이다.


출처: http://www.androes.com/139

public class SmsProcess extends Service {
    static final String TAG = "ANDROES";
   
    final Handler mHandler = new Handler();
    boolean stopTask = true;
    private static final int TIMER_PERIOD = 1 * 1000; // 1 sec
    private static final int MAXCOUNT = 10;
    private int mCounter;

    public void onStart(Intent intent, int startId) {
         processAlarm();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        processAlarm();
        return START_NOT_STICKY;
    }

    private void processAlarm() {
        // TODO Auto-generated method stub
       
        // Set volume
        mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
        // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); // 무음
        // mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); // 진동
        mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, 0);
        for(int i=1; i<=maxVolume; i++){
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_RING,  AudioManager.ADJUST_RAISE, 0);
        }

        // 벨소리 울리게 하기
        RingtoneManager ringtoneManager = new RingtoneManager(this);
        alarmRingtone = ringtoneManager.getRingtone(this, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM));
        alarmRingtone.play();

        stopTask = false;
        startTimer();
       
        // Service Stop
        this.stopSelf();
    }
   
    private void startTimer() {
        // TODO Auto-generated method stub
        Logger.i("ANDROES", "start startAlarm() : mCounter: " + mCounter);
        final Runnable r = new Runnable() {
            @Override
            public void run() {
                // 주기적으로 반복될 내용
                if (++mCounter >= MAXCOUNT) {
                    stopTimer();
                    alarmRingtone.stop();
                }
                Logger.i("ANDROES", "mCounter : " + mCounter);
                if (!stopTask) mHandler.postDelayed(this, TIMER_PERIOD);
            }
        };
        if (!stopTask) mHandler.postDelayed(r, TIMER_PERIOD);
    }

    private void stopTimer() {
        // TODO Auto-generated method stub
        Logger.i("ANDROES", "start stopAlarm() : mCounter: " + mCounter);
        stopTask = true;
    }
   
}


타이머 관련 링크

알람을 이용한 시간을 동적으로 조절 방법
http://www.androidpub.com/index.php?_filter=search&mid=android_dev_qna&search_target=title&search_keyword=%ED%83%80%EC%9D%B4%EB%A8%B8&page=1&division=-970287&document_srl=954303 

그런데 타이머 period를 동적으로 지정해 주고 싶습니다.

하지만 아래 코드에서 실행되는 서비스를 보니
동적으로 바뀐 period타임이 적용되지 않는거 같습니다. 

구현 코드는 다음과 같습니다.
================================================
 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       long period = Long.parseLong(timeDelay)*1000;
       updateTimer = new Timer("ordersUpdates");
       updateTimer.scheduleAtFixedRate( new TimerTask() {

      @Override
      public void run() {
        refreshCount();
        }
        }, 0, period);

        return Service.START_STICKY;
    }

================================================

어떻게 period를 줘야 동적으로 바뀐 시간이 적용되어 서비스가 정해진 시간간격으로 수행될까요??

이 게시물을...

 

목록

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=954303&act=trackback&key=feb

2010.11.04 21:12:32

볼레로

알람

2010.11.05 10:25:19

palfuni

알람으로 해결했습니다. 수정된 코드는 다음과 같습니다. 감사합니다.

1.long period = Long.parseLong(timeDelay)*1000;

1.Log.d(LOG_TAG, "delay"+period);

1.int alarmType = AlarmManager.ELAPSED_REALTIME;

2.long timeToRefresh = SystemClock.elapsedRealtime() +period;

3.alarms.setRepeating(alarmType, timeToRefresh, period, alarmIntent);


핸들러와 알람을 사용 차이점
http://blog.naver.com/pjsin865?Redirect=Log&logNo=120066422409 

오늘은 안드로이드 SDK에서 일정시간 후에 일어나는 혹은 주기적인 작업처리 방법에 대해서 알아보겠습니다. 이러한 Timing 작업을 처리하기위해 Handler AlarmManager를 사용할 수 있는데 둘 간의 차이점을 잘알고 사용하셔야 합니다

먼저 AlarmManager 현재 특정 어플리케이션이 실행되고 있지 않더라도 특정 시점에 해당 어플의 코드가 실행되도록 할때 사용됩니다. 또한 일정 시간 후 어플리케이션이실행될 수 있게 합니다.
현재 내 어플리케이션의 Activity가 보여지고 실행되고 있는 상황에서 타이밍 작업을 할때에는Handler를 사용하는 것이 바람직합니다. AlarmManager는 단말이 슬립모드에 들어가있을 경우에도 단말을 깨워서 작업처리를 할 때 사용할 수 있습니다. 거의 대부분 UI상에서의 타이밍 작업은 Handler로 이루어집니다. 
Handler는 특정 시간후에 작업을 처리하기 위해서 사용되는 경우와 UI 쓰레드상에서의 코드 실행을 위해서 사용되는 경우가 있습니다. 

Handler 
- 쓰레드의 메세지큐에 메세지나 Runnalble을 보낸다.
- 각 핸들러는 하나의 쓰레드에 연결되어 있다.
- 사용하는 경우
  1. 일정 시간 후에 실행할 작업이 있는경우
  ex) 10초 후에 어떤 일을 처리 하고 싶다.
 

 private Handler mHandler;  
mHandler.postDelayed(new Runnable(){
         public void run(){
         //처리 하고 싶은 일
         }
        },1000);


  2. 다른 쓰레드에서 UI 관련된 함수 실행을 원할 경우
    -UI와 관련된 함수는 대부분 UI쓰레드에서만 호출될  수 있다.
    - View.post(Runnable action)
      : view에서도 편리함을위해 메세지를 post해주는 함수 존재

저와 함께 간단한 예제를 한 번 만들어보겠습니다.
 --10초에 한 번씩 현재 시간을 로그에 출력하도록 하겠습니다.
 --Activity종료후에도 계속 진행되아야합니다.

자~~ 여기서,, 무엇을 써야 할 까요? 2번째 문장에선 우리는 Handler가 아니라AlarmManager를 써야 한다는 것을 알 수 있습니다.
AlarmManager와 Service를 써서 구현할 수도 있구요 저 같은 경우는 BroadcastReceiver를 사용하여 위에 문제를 풀려고 합니다.

주요 코드를 살펴보도록 하겠습니다.

//아래부분은 pendingIntent를 생성하는 부분입니다.
그렇다면 PendingIntent가  뭘까요?이 클래스의 인스턴스는 getBroadcast나 getService함수를 통해 생성되고 PendingIntent를 다른 어플리케이션에 줌으로써 다른 특정한 어플리케이션에서 어떤 작동을 할 수 있도록 합니다.
  
Intent intent = new Intent(AlarmManager.this, AlarmService_Service.class);
        PendingIntent sender = PendingIntent.getBroadcast(AlarmManager.this,
                0, intent, 0);
//브로드캐스트를 쓰지 않고 service를 쓰시려면 getSystemService란 함수를 쓰시면 됩니다.

        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 10*1000;

 //Alarm을 설정합니다. 10초마다 어떤 일을 반복해서 하고 싶어요       
 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        firstTime, 10*1000, sender);

    //일단 처음 한 번 현재 시간을 출력 합니다.  
      final Calendar c = Calendar.getInstance();
        int mHour = c.get(Calendar.HOUR_OF_DAY);
        int mMinute = c.get(Calendar.MINUTE);
        int mSecond =c.get(Calendar.SECOND);
        
        if (mToast != null) {
            mToast.cancel();
        }
        mToast = Toast.makeText(alarmmanager.this, "현재 시간"+mHour+":"+mMinute+":"+mSecond,
                Toast.LENGTH_LONG);
        mToast.show();

저 빨간색으로 적힌 AlarmService_Service 클래스는 다음과 같습니다.

public class AlarmService_Service extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) //10초마다 이리루 들어옵니다
     {
         final Calendar c = Calendar.getInstance();
         int mHour = c.get(Calendar.HOUR_OF_DAY);
         int mMinute = c.get(Calendar.MINUTE);
         int mSecond =c.get(Calendar.SECOND);        
         
         Toast.makeText(context, "현재 시간"+mHour+":"+mMinute+":"+mSecond, Toast.LENGTH_SHORT).show();
     }
 }

이렇게 해서 실행을 하면 우리가 생각한대로 처음에 시간이 나오고 10초마다 시간이 나와야 하는데 OnReceive가 호출되지 않음을 확인할수 있습니다.
정상적으로 동작을 하려면 AndroidManifest.xml에 다음과 같이 추가를 해줘야 합니다.
    <application android:icon="@drawable/icon" android:label="@string/app_name">
       <receiver android:name="AlarmService_Service" android:process=":remote" />

그러면 다음과 같이 화면이 뜨는 것을 볼 수 있습니다.




그리고 현재의 Activity가 종료되더라도 다음과 10초마다 다음과 같은 화면이 뜹니다


코드가 필요하시다면 제게 요청하면 자료실에 올려드리도록 하겠습니다..

[출처] [펌]Handler와 AlarmManager - 열 두번째 시간|작성자 


핸들러를 이용한 특정 시간 후 발생 처리
http://blog.naver.com/regako?Redirect=Log&logNo=130109629490

안드로이드의 유연한 사용을 위해 반드시 필요한 두 가지 개념 핸들러와 쓰(번데기 발음)레드 중

핸들러의 간단한 사용법이다.

 

일단 예제는 매우 간단하게,

액티비티 실행 후 2초 동안은 back키를 눌러도 나갈 수가 없게 만들고, 2초가 지난 뒤 부터

다시 back으로 액티비티를 종료시키도록 하는 프로그램이다.

다양하게 짜기도 귀찮다. 필요한 요소만 쏙쏙!!!

 

일단 못 나가게 만드는 코드다.

 

onKeyDown을 오버라이드해서 back키의 제어권을 가져온다. 위 코드는 조건변수에 대한 변경이

없기 때문에 back을 초당 200번을 누르는 노력을 한다고 해도 절대 못나간다.(쏘리는 뜨게 할 수 있으려나)

 

그럼 여기에 핸들러를 추가해서 조건변수 변경 부분을 넣도록 하자.

 

 

 

 

 

별로 말할 것도 없다. 핸들러 추가하고, onCreate 말미에 그 핸들러에 2초후 메세지를 날리는 메서드를 호출하면 끝이다.

그리고 핸들러에서는 handleMessage를 오버라이딩해서 원하는 코드를 넣고...

이러면 동작 완료!!!

 

 

...................

원래는 회사에서 저렇게 하면 안 됐었는데 집에서 하니까 잘된다..ㅡ.ㅡ;;;음 회사쪽에 다른 문제가 있나보군...

어쨌든, 회사에서 사용한 두번째 방법도 함께 올리도록 하겠다.

메세지 전송 방식이 아닌 Runnable을 이용한 색다른 방법이다.

 

 

 

 

이렇게, 핸들러는 생성만 해주고 아무것도 안해주되, send message대신 post 메서드를 호출한다.

post는 첫째 인자로 넘기는 Runnable을 실행하도록 하는 기능을 가지고 있다.(Delayed는 지정한 시간 후 실행)

핸들러와 쓰레드를 교묘하게 섞은 방식이라 하겠다.

완료다....이것도 잘된다...오늘은 별로 쓸 게 없군.

아, 재미삼아 추가하면, run()안에서 다시 mH.postDelayed(mR,2000)을 호출하면 이 run()이 2초후에 다시 불리게 된다.

이 호출부를 넣고, allowOut을 토글시키는 코드를 넣으면 2초 간격으로 back으로 나갈 수 있게 없게를 교차시킬 수 있다.

....재미 없구만.

 

오늘은 간단히 여기서 끝~



출처: https://202psj.tistory.com/304 [알레폰드의 IT 이모저모]

728x90
반응형