2012-09-20 39 views
2

如果我的计数器超过30秒,它经常跳过一秒钟。我已经倒计时了,显示屏显示。但它选择跳过随机数字。它跳过的数字每次都是相同的数字。如果我改变了定时器的长度(用户这样做),它会改变跳过的数字。我发布了我的代码;为什么跳过秒? CountDown计时器

免责声明:这是我的第一个(有用的)应用程序,所以它可能会吸得很糟糕,或者结构不好。没关系,让我知道。我可以接受批评。但看看,如果有人有一个想法,为什么某些秒钟失踪请加油。谢谢!

package com.ApphHose.runnersTimer; 

//import a bunch of stuff 

public class MainActivity extends Activity { 
TextView text, lapNumber; 
Button start; 
boolean workrest, vibe; 
int letsRun, lapCounter; 
long length; 
CountDownTimer timer; 

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

    text = (TextView) findViewById(R.id.tv); 
    lapNumber = (TextView) findViewById(R.id.tvLap); 
    start = (Button) findViewById(R.id.bStart); 
    letsRun = 2; 
    lapCounter = 1; 
    workrest = true; 
    vibe = true; 

    start.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY); 

    start.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      start.setText("Stop"); 
      start.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY); 
      lapNumber.setText("Lap Number: 1"); 
      lapCounter = 0; 
      run(); 
     } 

    }); 

} 

private void run() { 

    SharedPreferences getSetup = PreferenceManager 
      .getDefaultSharedPreferences(getBaseContext()); 
    String setRun = getSetup.getString("run", "1"); 
    long setRunset = Long.parseLong(setRun); 
    setRunset = setRunset * 1000; 

    String setWalk = getSetup.getString("walk", "1"); 
    long setWalkset = Long.parseLong(setWalk); 
    setWalkset = setWalkset * 1000; 

    if (letsRun >= lapCounter) { 

     if (workrest == true) { 
      workrest = false; 
      length = setRunset; 

     } else { 
      workrest = true; 
      length = setWalkset; 
     } 

     final CountDownTimer timer = new CountDownTimer(length, 1000) { 

      @Override 
      public void onFinish() { 

       if (workrest){ 
        if (vibe){ 
         Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
         v.vibrate(2000); 
         run(); 
        } else { 
         run(); 
        } 

       }else{ 
       lapCounter ++; 
       lapNumber.setText("Lap Number: " + lapCounter); 
       run(); 
       } 
      } 

      @Override 
      public void onTick(long millisUntilFinished) { 
       long min, sec; 
       // TODO Auto-generated method stub 
       min = millisUntilFinished/(60 * 1000); 
       sec = (millisUntilFinished/1000) % 60; 
       String tmr = String.format("%d:%02d", min, sec); 
       text.setText("" + tmr); 

      } 

     }; 
     timer.start(); 
     start.setOnClickListener(new View.OnClickListener() { 
      //this is my button. start and stop. 
      public void onClick(View v) { 
       if (start.getText() == "Stop") { 
        start.setText("Start"); 
        lapCounter = 1; 
        start.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY); 
        timer.cancel(); 
        lapNumber.setText("Lap Number: 1"); 
        text.setText("Stopped"); 
       } else { 
        start.setText("Stop"); 
        start.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY); 
        run(); 
       } 
      } 
     }); 

    } else { 
     text.setText("Done!"); 
     lapCounter = 1; 

    } 

} 

// pop up menu 
@Override 
public boolean onCreateOptionsMenu(android.view.Menu menu) { 
    // TODO Auto-generated method stub 
    super.onCreateOptionsMenu(menu); 
    MenuInflater blowUp = getMenuInflater(); 
    blowUp.inflate(R.menu.setup, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.setup: 
     Intent i = new Intent("com.ApphHose.runnersTimer.SETUP"); 
     startActivity(i); 
     break; 
    case R.id.out: 
     finish(); 
     break; 
    } 
    return false; 
} 
} 

回答

6

sec = (millisUntilFinished/1000) % 60;

整数由整数分割产生整数,很有可能舍入误差。

sec = (millisUntilFinished/(double) 1000) % 60;

+0

或者,根据具体情况,长分为长。 – debracey

+0

您需要将millisUntil ...或1000上升到两倍,以便获得浮点除法。将1000转换为更安全,因为这绝对适合双倍空间。 – debracey

+0

太棒了。谢谢。我想我需要做一些关于浮点的研究。 –