2013-03-28 23 views
8

私のアプリケーションには、15秒ごとにAsyncTaskを起動するタイマーがあります。Androidの再起動タイマーがキャンセルされた後

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

は、使用してみてください:

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

私はcouldntがまだ得るのは、schedule()メソッドの第2引数は何ですか? timer.schedule(timertask、0、15000)、この例では0は何を意味するのですか – antroid

12

ので(キャンセルに関するドキュメントを言う)方法:

注 繰り返しタイマータスクの実行メソッドからこのメソッドを呼び出すと、タイマータスクが 再び実行されないことを保証します。

これは、一度キャンセル()しても再度実行できないことを意味します。タイマーの新しいインスタンスを作成する必要があります(たとえば、onResume()メソッドで再実行する場合)。

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

代わりのTimerTaskを使用して、あなたはserviceに(GPSを更新するために使用される)あなたのコードを移動することができます。私はそれが良いと思う。 はonCreate()に、stopService()にはonDestroy()と記載してください。サービスはメインのUIスレッドで実行されるので、GPS更新タスクではNetworkOnMainThreadExceptionを避けてください。

+0

これは私の初期のアプローチでしたが、何らかの理由で私のサービスが開始しませんでした。本当に重要ですが、それが本当のことに発展したら私のTODOリストに載っています! – pteixeira

関連する問題