0

基本的な mm::ss timer を実装する必要があるアクティビティがあります。以下は、私が書いたコードです。ただし、問題は、エミュレーターの戻るボタンを押してアプリをもう一度クリックすると、値がはるかに速く変化することです。onCreate が再度呼び出されているようです。これを修正するにはどうすればよいですか? ブール変数を作成し、タスクが初めて呼び出されたときに true に設定しようとしました。値が false の場合にのみ startPeriodidUpdates() を呼び出しますが、onCreate は false の値で変数を再度作成します。

   public class GraphicsActivity extends Activity {
static int seconds = 0;
static int minutes = 0;
public static String time_elapsed;
public static boolean clearView = true;
Handler myhandler = new Handler();
public static String min,sec;  
public static boolean running = true;


   @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
     startPeriodicUpdates();

    } 
    public void onResume(){
    super.onResume();
    } 
    public void onPause() {
    super.onPause();    
    }
   public void onStop(){
   super.onStop();
    }

   public void startPeriodicUpdates()
   {
periodicCall();
   }
   public void stopPeriodicUpdates(){ 
     myhandler.removeCallbacksAndMessages(myhandler);
   }

   public  void periodicCall()
    {

seconds++;
if(seconds ==60)
{
    seconds=0;
    minutes++;
    if(minutes==60)
    {
        seconds=0;
        minutes=0;
    }
}
// left-padding zeros to the minutes and seconds values
min = String.format("%02d",minutes);
sec = String.format("%02d",seconds);
time_elapsed =  min + ":" + sec;
time_elapsed =  min + ":" + sec + "";
myhandler.postDelayed(new Runnable(){
    public void run(){
        periodicCall();

    }
},1000);

}

4

4 に答える 4

1

タイマーを実装するためにサービスを使用する方が良いと思います。戻るボタンを押しても、サービスは実行を継続します。

ここに私が少し前に尋ねた質問を見ることができます。サービスを使用したカスタムクロノメーターの実装を確認できます。

クロノメーターの値を受け取りたいアクティビティには、次のようなBroadcastReceiverが必要です。

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        mMilis = intent.getLongExtra("milis",0);
        String time = intent.getStringExtra("tiempo");
        // Do Something with the time
    }
};
于 2012-04-24T06:46:05.787 に答える
1

おそらくこれが役に立ちます: 定期的なタスクを実行する正しい方法は、ハンドラを にOnResume登録し、 で登録解除することOnPauseです。(別の場所で登録解除できますが、OnPause が重要です)

于 2012-04-24T05:24:25.530 に答える
0

これは上記の問題の解決策ではないかもしれませんが、ビューを更新して特定の時間からカウントアップしたいだけなら、Chronometerを見てください。カウントダウンしてビューを更新したい場合は、CountDownTimerでそれを行うことができます

于 2012-04-24T05:25:29.083 に答える
0

共有プリファレンスを使用して、このメソッドを 1 回だけ使用できます。

//初めて true を渡す

 protected void storeSharedPrefs(Boolean value) {
        /*
         * Storing in Shared Preferences
         */
        editor.putString("first", value);
        editor.commit();  //Commiting changes
    } 

SharedPreferences をチェックして、アプリケーションがロードされるたびに、初回であり、構成の詳細が正しく入力されているかどうかを確認します。

private boolean first_time_check() {
        /* 
         * Checking Shared Preferences if the user had pressed 
         * */
        Boolean  first = uPreferences.getString("first", false);

            return first;
    }
于 2012-04-24T06:09:08.067 に答える