2012-05-16 2 views
1

Мне нужно рассчитать разницу во времени в часах, минутах и ​​секундах и время обновления моей активности запуска через каждую секунду. Я использую этот код.Вычислить время Разница между текущим временем и временем в будущем, после каждой секунды

   private Handler handler=new Handler() ; 
private Runnable updateTimeTask = new Runnable() { 
    @Override 
    public void run() { 

      updateTime(); 
      //handler.postDelayed(updateTimeTask, 1000); 

    } 
    };   @Override 
protected void onResume() { 
    super.onResume(); 



    int delay = 1000; // delay for 1 sec. 

    int period = 1000; // repeat every 4 sec. 

    Timer timer = new Timer(); 

    timer.scheduleAtFixedRate(new TimerTask() { 

    public void run() { 

     handler.post(updateTimeTask); 

    } 

    }, delay, period);   }   
     private void updateTime() { 

    final TextView time = (TextView) findViewById(R.id.txtViewTime); 
    final TextView date = (TextView) findViewById(R.id.txtViewAlarmDesc); 


    pref = new Prefs(this); 
    String goal_dateTime= pref.getValue("first_goal_dateTime", ""); 

    Date d1 = Utils.strToDate(goal_dateTime); 


    Calendar cal = Calendar.getInstance(); 
    if(d1!=null && d1.after(new Date())) 
    { 
    cal.setTime(d1); 
    } 
    Date cur = new Date(); 
    Calendar cal_cur = Calendar.getInstance(); 
    cal_cur.setTime(cur); 


    final SimpleDateFormat formatterTime = new SimpleDateFormat("H:mm"); 

     long milliseconds1 = cal.getTimeInMillis(); 
     long milliseconds2 = cal_cur.getTimeInMillis(); 
     long diff = milliseconds1 - milliseconds2; 
     long diffSeconds = diff/1000; 
     long diffMinutes = diff/(60 * 1000); 
     long diffHours = diff/(60 * 60 * 1000); 
     long diffDays = diff/(24 * 60 * 60 * 1000); 


     time.setText(diffHours + " : " + diffMinutes+" : "+diffSeconds); 
     date.setText(String.valueOf(diffDays+" days left to complete goal")); 


} 

Но когда я первый раз начала деятельности, он отлично работает, и когда я начать другую деятельность от нее и вернуться к нему снова, приложение просто зависает и появляется черный экран, и после того, как много времени это дает мне ошибки как ANR, keydispatchtimeout.

Я попробовал несколько решений, как вызов моего updateTime() в отдельном потоке, но он дает мне ошибку, что «только оригинальному поток, который создал иерархию вида может коснуться его точка зрения.»

любого вида помощи будут оценены. Большое спасибо заранее.

с уважением, Munazza K

ответ

0

Я подозреваю, что ваша проблема что вы не удаляете свои обратные вызовы, когда вы покидаете действие. Я реализовал то же самое несколько иначе, используя postDelayed, а не scheduleAtFixedRate, как показано ниже:

private Handler h = new Handler(); 
    private static final long TIME_EVERY_SECOND = 1000; 

    private Runnable onEverySecond = new Runnable() { 
      public void run() { 
       updateTime(); 
       h.postDelayed(onEverySecond, TIME_EVERY_SECOND); 
      } 
     }; 

     @Override 
     public void onPause() { 
      super.onPause(); 

      if (h != null) { 
       h.removeCallbacks(onEverySecond); 
      } 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 
      h.postDelayed(onEverySecond, TIME_EVERY_SECOND); 
     } 
+0

Большое спасибо Дамиан, моя проблема решена. Я застрял много дней. Спасибо тебе большое. – Munazza

0

Вы должны использовать runOnUiThread обновить свои взгляды.

+0

Большое спасибо за ваш ответ Саймон. Я попытался запустить его с помощью runOnUiThread, который не дал мне ANR Keydispatchtimeout, но он все еще был слишком медленным, и появился черный экран, и в Logcat появились сообщения, подобные следующим. 05-17 00: 32: 40.573: W/ActivityManager (61): истечет время ожидания, оставляя блокировку слежения! Запуск простоя активности для HistoryRecord {406cd788 alarm.app/.AlarmAppActivity} Активность разрушения тайм-аута для HistoryRecord {406cd788 alarm.app/.AllGoalsActivity} – Munazza

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