2013-03-28 3 views
8

저는 응용 프로그램에 AsyncTask를 15 초마다 실행하는 타이머가 있습니다.안드로이드가 타이머를 취소 한 후 다시 시작합니다.

Timer timer = new Timer(); 

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
} 

이 방법은 onCreate() 메서드에서 시작됩니다.

다른 활동을 호출 할 때 내 타이머에서 내 onPause() 방법으로 timer.cancel()을 사용하여이 타이머를 취소해야합니다.

이제 주 활동으로 돌아 가면 타이머를 다시 시작해야합니다. onRestart() 메서드에서 AsynchTaskTimer()을 다시 실행하려고했지만 java.lang.IllegalStateException: Timer was canceled이 표시됩니다.

타이머를 어떻게 다시 시작합니까? 사용

+0

onpause에서 타이머를 null로 설정하고 timer = new Timer()와 같이 다시 삽입하십시오. 이전 해시 된 객체가 취소 된 것처럼 실행하십시오. 새 객체로 다시 시작하지 않는 한 다시 시작할 수 없습니다. –

+0

왜 핸들러와 타이머를 함께 사용합니까? – tony9099

답변

14

시도 : 다시 타이머에 메모리를 할당하고 AFAIK 시작할 수 있습니다이를 이용하여

public void AsynchTaskTimer() { 
    final Handler handler = new Handler(); 

    TimerTask timertask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new updateGPSTask().execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer = new Timer(); //This is new 
    timer.schedule(timertask, 0, 15000); // execute in every 15sec 
    } 

.

+0

감사합니다.이 방법은'onPause()'메서드에서 타이머를 취소하는 것과 함께 작동합니다! – pteixeira

+0

그거 대단해 !!! –

+0

내가 할 수있는 것은 아직 얻을 수없는 일은 schedule() 메서드의 두 번째 매개 변수는 무엇입니까? timer.schedule (timertask, 0, 15000),이 예제에서 0은 무엇을 의미합니까 – antroid

12

그래서 에 대한 문서 취소 것을 말한다() 방법에있어서, 반복 타이머 태스크의 실행 메소드 내에서이 메소드를 호출하면 타이머 작업이 다시 실행되지 않게

참고.

즉, 타이머를 한 번 취소()하면 다시 실행할 수 없습니다. 타이머를 다시 실행하려면 onResume() 메서드와 같이 Timer의 새 인스턴스를 만들어야합니다.

@Override 
public void onResume() { 
    super.onResume(); 
    // intialise new instance of Timer 
} 
1

대신 TimerTask를 사용, 당신은 service에 (GPS를 업데이트하는 데 사용됩니다) 코드를 이동할 수 있습니다. 나는 그것이 더 좋다라고 생각한다. 은 onCreate()이고 stopService()onDestroy()입니다. 서비스는 기본 UI 스레드에서 실행되므로 GPS 업데이터 작업에서 NetworkOnMainThreadException을 피하십시오.

+0

이것은 내 초기 접근 이었지만 어떤 이유로 내 서비스가 시작되지 않았습니다 .. 이것은 개념 증명을위한 것일 뿐이므로 정말 중요 하긴하지만, 진짜로 발전하면 내 TODO 목록에 있습니다! – pteixeira

관련 문제