2012-02-19 16 views
0

私は常時実行する必要のあるCountDownTimerを持っています。 2つの活動(AとB)があります。アクティビティAにはCountDownTimerがあり、内部のTextViewを更新します。 Bに切り替えると、CountDownTimerがまだ実行されています(これが望ましい動作です)。しかし、Aに戻ったとき、古いものと新しいAがあるようです。タイマーは、「新しい」AのTextViewを更新しません。 A.初めて訪れたときには1回だけ起動します。どのようにこの問題を解決するための任意のアイデア?たぶんタイマーを別の場所に置いていますか?
編集:いくつかのコード:CountDownTimerは、アクティビティの切り替え時に古いアクティビティで実行されます。

private void prepareTimer() { 
    // TODO: DOES NOT WORK YET! (switching activities -> runs in old activity) 
    textTime = (TextView) findViewById(R.id.text_time); // is a field 

    if (!timerRunning) { 
     timerRunning = true; 

     int duration = 60000; 
     timer = new CountDownTimer(duration, 1000) { 

      public void onTick(long millisUntilFinished) { 
       long minsLeft = (long) Math.floor((double) millisUntilFinished/(double) Constants.ONE_MINUTE) + 1; 
       textTime.setText(minsLeft + " Min."); 
      } 

      public void onFinish() { 
       textTime.setText("done!"); 
      } 
     }; 
     timer.start(); 
    } 
} 
+0

ねえ、あなたがあなたの活動のライフサイクル...にBから戻ってくるときは必ずONSTART(...)メソッド内のstuffsがあることを確認してくださいについての詳細を学ぶ必要があります。 – Cehm

+0

いくつかのコードを投稿すると助けになるかもしれない –

答えて

0

CDTは自身の別のスレッドで実行されています。そのCDTでアクセスしようとしているTextView参照は、もはやあなたがAに戻ったときCDTスレッドがまだ実行されていたTextViewという新しい参照を作成しよう(あなたはBであったあなたのアクティビティAは、もはや見えたので)使用可能ではありませんあなたがAからBまたはviceversaに移動したかどうかは関係ありません。これが助けてくれるといいなあUIスレッドの変更を確認してください。 ;)

編集:

private void prepareTimer() { 
    // TODO: DOES NOT WORK YET! (switching activities -> runs in old activity) 
    textTime = (TextView) findViewById(R.id.text_time); // is a field 

    if (!timerRunning) { 
     timerRunning = true; 

     int duration = 60000; 
     timer = new CountDownTimer(duration, 1000) { 

      public void onTick(long millisUntilFinished) { 
       long minsLeft = (long) Math.floor((double) millisUntilFinished/(double) Constants.ONE_MINUTE) + 1; 
       textTime.setText(minsLeft + " Min."); 
      } 

      public void onFinish() { 
       textTime.setText("done!"); 
      } 
     }; 
     timer.start(); 
    } 
    else 
    { 
    textTime = (TextView) findViewById(R.id.text_time); 
    } 

} 
+0

しかし、新しい参照を使用するようにタイマーに指示するにはどうすればよいですか?現在、タイマーは 'onTick()'メソッド内のTextViewを更新します。最初の投稿を明確にするためのコードを更新します。 –

+0

'if(MyActivity.this!= null && textTime == null)textTime = MyActivity.this.findViewById(R.id.mytxt);' on 'onTick()' –

+0

これは機能しませんでした。 'textTime'は決して' null'にならず、 'prepareTimer()'をもう一度呼び出すと、BからAに再び切り替えるとき、新しい 'textTime'は別のObjectです。古いタイマーは古いものを更新し続けます。 –

関連する問題