앱툴즈
46.♡.168.138
46.♡.168.129
46.♡.168.161
46.♡.168.136
46.♡.168.145
46.♡.168.162
46.♡.168.144
46.♡.168.140
115.♡.135.198
46.♡.168.139
 
게시물 88건
   
handler를 이용해 가변시간 반복 작업하기.
글쓴이 : 김병주                   날짜 : 2012-11-26 (월) 15:19 조회 : 7256
주기적인 반복작업으로 TimerTask 나 CountDown을 쓰는 방법도 있습니다.
저도 위의 방법을 사용하다가 위 두 방법의 공통적인 단점은, 주기의 시간을 마음대로 변경할 수
없다는 점입니다.
 
TimerTask는 timer의 스케쥴에 의해 일정한 시간으로 반복되고,
CountDown 역시 초기값에 의해 시간이 다 될 때까지 반복작업을 합니다.
 
TimerTask는 사용자가 스케쥴을 cancel하지 않는 이상 꺼지지 않는 무한 반복이고,
CountDown은 반대의 경우죠.
 
간단한 반복 작업에는 무리가 없을 지 모르나, 네이트온 처럼 시간을 점점 늘려가며 주기시간을 늘릴
수는 없어서 Handler의 sendEmptyMessageDelayed를 사용했습니다.
 
원리는 정의한 x초만큼의 시간 뒤에 handler에게 메세지를 쏘고 handler는 다시 해당 method를
 
부릅니다.
 
이런식으로 하면 사용자가 중지하고 싶은 시간을 설정할 수도 있고, 메세지를 받을때마다 가변적으로
 
시간을 조정하여 시작시킬수도 있죠.
 
우선 handler쪽을 봅시다.
 
long reconnectionTime = 1000;
long limitTime = 3600000;
Handler connectionHandler = new Handler()
  {
   @Override
   public void handleMessage(Message msg) {
    // TODO Auto-generated method stub
    switch (msg.what) {
    case 0:
     
     if(reconnectionTime <= ( limitTime /2))
     {
     reconnectionTime = reconnectionTime*2;
     Log.d("connectionRetry", "reconnectionTime : "+reconnectionTime);
      try{
      handlerconnect();
      }catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
      }
     }
     else
     {
     reconnectionTime =  limitTime ;
     Log.d("connectionRetry", "reconnectionTime : "+reconnectionTime);
      try{
      handlerconnect();
      }catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
      }
     }
     
     break;
     
     
    case 1:
        Log.d("connectionRetry", "Login_success_full...handler work end....");
     break;
    
    }
    
    super.handleMessage(msg);
   }
   
  };
  
handler에서는 0을 받을때마다 메세지 딜레이시간을 2배씩 늘리고, 한계시간인 10분에 도달하면
 
더이상 증가하지 않고 10분마다 한번씩 메세지를 쏩니다.
 
다음은 handlerconnect(); 입니다.
 
 public void hanadlerconnect()
  {
   int rend=0;
   Random rand = new Random();
   rend = Math.abs(rand.nextInt()%9);
  if(rend ==6)
  {
   connectionHandler.sendEmptyMessageDelayed(1, 1000);
  }else
  {
   connectionHandler.sendEmptyMessageDelayed(0, reconnectionTime);
  }
  }
 
rend 값이 6이면 반복작업을 멈추고, 종료합니다.
rend 값이 6이 아니면 딜레이값을 핸들러에 의해 2배씩 늘려가며 작업을 반복합니다.
 
물론 쓰레드를 사용해도 가능합니다. 단, 쓰레드 사용시에는 반드시 그 객체가 종료되거나
 
wait상태 이어야 겟죠.
 
혹시라도 가변시간을 갖는 반복작업이 필요하신분들은 스케쥴러 대신 이방법을 쓰는것도
 
좋은 방법일 겁니다.
* 글을 등록하실때 꼭 필요한 경우가 아니면 개인정보를 남기지 마세요 ^^ (연락처,이메일주소,주민등록번호 등)




김병주 님의 Tip&Tech 최신글 [더보기]


   

게시물 88건
번호 제목 글쓴이 날짜 조회
88  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 참석 요청 준모 11-30 2550
87  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 준모 11-23 2483
86  개인개발자 SW개발환경 지원사업 안내 준모 10-28 2682
85  맥에서 구글 API key 등록방법 성기동 08-29 3575
84  [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 씨트린개발… 07-21 6324
83     [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 김은호 08-21 10877
82  자바 초보들에게 추천하는 기초 개념을 잡을 수 있는 책들 이경용 06-19 4719
81  [팁] 갤럭시 노트3 개발자 옵션 메뉴 찾기 ^^ 이경용 11-09 8627
80  앱템플릿을 제공하는 사이트 소개합니다. 씨트린개발… 08-21 11228
79  The content of the adapter has changed but ListView ... 에러 일반적 해결법. 김병주 04-16 14274
78  간단하게 패스워드에 숫자가 혼용되었는지 처리할 수 있는 메소드입니다. 김병주 01-31 5350
77  handler를 이용해 가변시간 반복 작업하기. 김병주 11-26 7257
76  String -> HEX 김병주 11-12 4639
75  리스트 작업시에 기본적으로 알아두셔야 될점. +1 김병주 10-08 5717
74  xml 직렬처리 고범석 09-24 3760
73  주소록 추가/삭제 감지해서 앱의 db추가/삭제하기. 김병주 09-24 11328
72  확장리스트가 3뎁스 이상이 될까? 안될까? +1 김병주 08-21 6504
71  ZXing 바코드 스캔부분 크기 조절하기. 김병주 08-06 13373
70  이클립스에서 레이아웃 xml 그래픽부분이 갑자기 안보일경우. +1 김병주 07-27 5330
69  간만에 글쓰네요 이번엔 launcherShortCut (바로가기 아이콘)입니다. 김병주 07-25 10894
 1  2  3  4  5  
 
 
 
Copyright ⓒ wwwold.androidstudy.co.kr. All rights reserved.