2016-07-14 2 views
0

私はスケジュールされたタイマーを実行して、学校に来るのを遅らせるようにしています。生徒が学校に到着するたびに、カスタムダイアログが開き、delay in arrival : 20.0 minの表示が表示されます。半分毎に0.5minずつ増加します。私のコードがある -ダイアログが閉じられた後にスケジュールされたタイマーを停止する方法

public void startTimer(long delay_minutes) { 
    final long delay = delay_minutes; 
    delay_countup = (double) delay; 

    //Start the scheduled time 
    departuretimer = new Timer(); 
    departuretimer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      countup = 0.0 + delay_countup; 
      Log.d("hi","Values 0" + delay_countup + countup); 
      mHandler.obtainMessage(1).sendToTarget(); 
      delay_countup = delay_countup + 0.5; 
      Log.d("hi","Values 1" + delay_countup); 
     } 
    }, 0, 30000); 
} 

public Handler mHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      delay_time.setText(String.valueOf(countup) + "min"); 
      rootView.invalidate(); 
     } 
    }; 

問題がある -

a)のタイマーはダイアログが新たに到着した学生のために開かれている場合でも、古い到着した学生のためにバックグラウンドで実行されます。ダイアログが閉じたときにタイマーが決して殺されないことを意味します(ダイアログは学生の到着を確認するためにのみ閉じます)

b)テキストビューdelay_timeが間違った値を表示することがあります。 22.0minとすぐに0.5minと表示され、次に23.0minと表示されます。

これはなぜですか?

EDIT 1:ダイアログ

private void handleClickAction() { 
     dismiss(); 
     timer.cancel(); 
     timer = null; 
} 

EDIT 2でのボタンのクリック後timer cancelの取り扱い : ログは常に正しい値を表示するが、UIで時々問題があります。問題は、例えばということです - ...

delay_countup = 50.0 
countup = 50.0 
Textview updates as 50.0 //This is correct 

Now, 
delay_countup = 50.5 
countup = 50.5 
Textview updates as 0.5 //This is incorrect. I need 50.5 

これは時々起こる

答えて

1

あなたが最初のタイマーを削除されることはありませんようです。したがって、2番目のタイマーを初期化するときに、2つのタイマーが同時にUIを更新しようとしています。

メンバ変数としてタイマを格納し、2番目のタイマを開始する前に初期化されているかどうかを確認します。ダイアログが閉じられたら、cancel()Timerする必要があります。だからメソッドwhen the dialog is dismissedを実装する方法も見てください。これは、cancel()というクリーンアップメソッドを呼び出し、タイマーをnullに設定する必要があります。

public class DialogTest extends Dialog { 

    Timer timer; 
    double countup = 0; 
    double initial_time = 0; 

    public DialogTest(Context context){ 
     super(context); 

    } 


    @Override 
    protected void onStart() { 
     super.onStart(); 

     startUpCounting(); 
    } 

    @Override 
    protected void onStop() { 
     Log.e("b", "timer stopped"); 
     if(timer != null){ 
      timer.cancel(); 
      timer = null; 
     } 

     super.onStop(); 
    } 

    public void startUpCounting() { 
     delay_for_student.setText("Delay in Arrival"); 
     rootView.invalidate(); 
     Log.e("b", "timer started"); 
     if(timer != null){ 
      timer.cancel(); 
      timer = null; 
     } 
     timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       countup = 0.0 + initial_time; 
       if (countup == 0.0) { 
        onTimeHandler.obtainMessage(1).sendToTarget(); 
       } else { 
        mHandler.obtainMessage(1).sendToTarget(); 
       } 
       initial_time = initial_time + 0.5; 
      } 
     }, 0, 1000); 
    } 



    public Handler mHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      Log.e("b", "timer: " + countup); 
      delay_time.setText(String.valueOf(countup) + "min"); 
      rootView.invalidate(); 
     } 
    }; 

    public Handler onTimeHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      Log.e("b", "timer ---"); 
      delay_time.setText("-"); 
      rootView.invalidate(); 
     } 
    }; 
} 
+0

私は上記のようにstartUpCounting()関数に入れたタイマーを1つしか持っていません。現在、私がしたのは、dismiss()が呼び出されたとき、次の行にtimer.cancel()を渡しても、まだ動作しませんでした。 – Mark023

+0

メソッドが呼び出されていますか?より多くのコードを含めることができますか?それもnullに設定します。 – bradkratky

+0

このメソッドはカウントダウンタイマーのonFinish()で一度だけ呼び出されていますが、タイマーもnullに設定されています。まだ動作していません。更新された質問を表示します。 – Mark023

関連する問題