2013-03-10 3 views
0

У меня есть этот код, который просто отображает обратный отсчет времени для события. У меня возникла проблема с последними секундами прыгать цифры в отличие от обычных часов. Вот код, с которым я работаю. Может кто-то, пожалуйста, предложите некоторые рекомендации, где эта проблема может быть. С уважением.TextView таймер секунд число прыгает

public class MainActivity extends Activity { 

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

    new Timer().schedule(new TimerTask() { 

     File sdcard = Environment.getExternalStorageDirectory(); 
     File cfgFile = new File(sdcard, "TimeTillParis/config.txt"); 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 

       try { 
        InputStream is = new FileInputStream(cfgFile); 
        Properties prop = new Properties(); 
        prop.load(is); 

        int mmY = Integer.parseInt(prop.getProperty("YEAR")); 
        int mmM = Integer.parseInt(prop.getProperty("MONTH")); 
        int mmD = Integer.parseInt(prop.getProperty("DAY")); 
        int mmH = Integer.parseInt(prop.getProperty("HOUR")); 
        int mmC = Integer.parseInt(prop.getProperty("MINUTE")); 
        int mmS = Integer.parseInt(prop.getProperty("SECOND")); 

        Calendar cal = Calendar.getInstance(); 
        Date today = new Date(System.currentTimeMillis()); 

        cal.set(Calendar.YEAR, mmY); 
        cal.set(Calendar.MONTH, mmM); 
        cal.set(Calendar.DAY_OF_MONTH, mmD); 
        cal.set(Calendar.HOUR_OF_DAY, mmH); 
        cal.set(Calendar.MINUTE, mmC); 
        cal.set(Calendar.SECOND, mmS); 

        long milliseconds = (cal.getTimeInMillis() - today.getTime()); 

        String mD="", mH="", mM="", mS="", boxText=""; 

        mD += (milliseconds/(1000*60*60*24)); 
        mH += (milliseconds/(1000*60*60) % 24); 
        mM += (milliseconds/(1000*60) % 60); 
        mS += (milliseconds/1000 % 60); 

        boxText += "Next visit to Paris in \n\n" + 
           mD + "d " + 
           mH + "h " + 
           mM + "m " + 
           mS + "s"; 

        TextView textView = (TextView) findViewById(R.id.textView_date_display); 
        textView.setText(boxText); 

       } catch (FileNotFoundException e) { 
        String cfgNotFound=""; 
        cfgNotFound += "config.txt not found!"; 
        TextView textView = (TextView) findViewById(R.id.textView_date_display); 
        textView.setText(cfgNotFound); 
        //e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       } 
      }); 
     } 
    }, 0, 100); 

} 

}

ответ

1

Я подготовил полное решение, дайте мне знать, если у вас есть какие-то вопросы:

public class MainActivity extends Activity { 

    private static final int COUNTDOWN_INTERVAL = 1000; 

    MyTimer timer; 

    Calendar eventTime; 

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

     File sdcard = Environment.getExternalStorageDirectory(); 
     File cfgFile = new File(sdcard, "TimeTillParis/config.txt"); 

     try { 
      InputStream is = new FileInputStream(cfgFile); 
      Properties prop = new Properties(); 
      prop.load(is); 

      int mmY = Integer.parseInt(prop.getProperty("YEAR")); 
      int mmM = Integer.parseInt(prop.getProperty("MONTH")); 
      int mmD = Integer.parseInt(prop.getProperty("DAY")); 
      int mmH = Integer.parseInt(prop.getProperty("HOUR")); 
      int mmC = Integer.parseInt(prop.getProperty("MINUTE")); 
      int mmS = Integer.parseInt(prop.getProperty("SECOND")); 

      Calendar cal = Calendar.getInstance(); 

      cal.set(Calendar.YEAR, mmY); 
      cal.set(Calendar.MONTH, mmM); 
      cal.set(Calendar.DAY_OF_MONTH, mmD); 
      cal.set(Calendar.HOUR_OF_DAY, mmH); 
      cal.set(Calendar.MINUTE, mmC); 
      cal.set(Calendar.SECOND, mmS); 

      eventTime = cal; 

     } catch (FileNotFoundException e) { 
      String cfgNotFound=""; 
      cfgNotFound += "config.txt not found!"; 
      TextView textView = (TextView) findViewById(R.id.textView_date_display); 
      textView.setText(cfgNotFound); 
      //e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if(eventTime != null) { 
      long millisInFuture = (eventTime.getTimeInMillis() - System.currentTimeMillis()); 
      timer = new MyTimer(this, millisInFuture, COUNTDOWN_INTERVAL); 
      timer.start(); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if(timer != null) { 
      timer.cancel(); 
     } 
    } 

    private static class MyTimer extends CountDownTimer { 

     TextView textView; 

     public MyTimer(Activity actitivy, long millisInFuture, long countDownInterval) { 
      super(millisInFuture, countDownInterval); 
      // findViewById is very expansive, so fined it only once 
      textView = (TextView) actitivy.findViewById(R.id.textView_date_display); 
     } 

     @Override 
     public void onFinish() { 

     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
      SimpleDateFormat sdf = new SimpleDateFormat("'Next visit to Paris in \n\n'd'd 'h'h 'm'm 's's'"); 
      String boxText = sdf.format(new Date(millisUntilFinished)); 

      textView.setText(boxText); 
     } 

    } 
} 
+0

Большое спасибо, это работает прекрасно. С расчетом есть только одна проблема. Дата, которую я определил, относится к 25 апреля 2013 года (у меня есть месяц, определенный как 3 в файле конфигурации), и на дисплее в настоящее время отображается только 15d 1h 48m 14s, когда это должно быть около 45d 12h. Я попытался это исправить, но это еще одна вещь, которую мне нужно изучить. –

+0

Как насчет сохранения временной отметки unix (miliseconds с 1970-01-01) в ваш файл? IMHO montsh подсчитываются с нуля. – gingo

+0

У меня есть правильные дни, часы и минуты. Я добавил часовой пояс CEST (только для тестирования), а также вычитал 1 месяц, а также 1 день, используя cal.add(). –

Смежные вопросы