2012-04-16 9 views
2

Im Timerを使用してTextViewを継続的に更新していますが、onResume()メソッド中にタイマーを再起動できません。 をonPause()onDestroy()の方法で使用しますが、タイマーをonResume()に再起動するにはどうすればよいですか?onResume()メソッドでタイマーを再起動しますか?

これは、あなたは、タイマーを再起動していけない...

int delay = 1000; 
int period = 1000; 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

public void run() { 
     //I update the TextView here 
    } 

}, delay, period); 

答えて

2

私のタイマーのコードです。新しいタイマーを使用する代わりに、つまり、onResume()の内側に新しいタイマーを作成します。以前のものを使用しなくなったので、ガベージコレクションが処理します。だから、onResumeで()次のコードを使用します。

timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

public void run() { 

    //update the TextView here 

} 

}, delay, period); 
+0

しかし、それは新しいスレッドを作成し、NTOメインUIスレッド – Snake

+0

@Snakeで実行んので、私はあなたが、タイマーを使用してGUIを更新することができないことを考えた:非GUIスレッドから呼び出された場合、一部のGUI更新機能が動作しますが、それは十分に文書化されていない。 GUIスレッドの外で呼び出すことのできない他の関数については、必要な場合にrunOnGUIThread()関数を使用することができます。 Handlerを使用してこの種のタスクを実行したいと思います。 – binW

5

簡単に代替がHandlerクラスを使用することです。 Timerクラスはアクティビティのライフサイクルに関係なく、潜在的なスレッド問題を心配する必要があるため、Timerクラスはお勧めしません。 Handlerを使用することの美しさは、すべてのコールバックがメインスレッド上にあることです(スレッドに関する問題は心配する必要はありません)。以下は、これを行う方法の簡単な例です。

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    .... 
    mHandler = new Handler(); 
} 

@Override 
protected void onResume() 
{ 
    mHandler.postDelayed(myRunnable, UPDATE_RATE); 
} 

@Override 
protected void onPause() 
{ 
    mHandler.removeCallbacks(myRunnable); 
} 

private final Runnable myRunnable= new Runnable() { 
    @Override 
    public void run() 
    { 
     //Do task 
     mHandler.postDelayed(myRunnable, UPDATE_RATE); 
    } 
}