2012-03-26 3 views
0

Я пытаюсь обновить время в TextView с помощью Runnable, который должен запускаться каждую секунду. Runnable запущен с FragmentonCreateView(), но он выполняется только один раз.Runnable для запуска каждую секунду выполняется только один раз в Fragment onCreateView()

Любой может помочь?

Благодаря

public class MyFragment extends Fragment { 

    Calendar mCalendar; 

    private Runnable mTicker; 
    private Handler mHandler; 

    TextView mClock; 

    String mFormat; 

    private boolean mClockStopped = false; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     RelativeLayout view = (RelativeLayout) inflater.inflate(R.layout.meteo_widget, container, false); 

     /* 
     * Clock (from DigitalClock widget source) 
     */ 

     mClock = (TextView) view.findViewById(R.id.clock); 

     mCalendar = Calendar.getInstance(); 

     mHandler = new Handler(); 

     mTicker = new Runnable() { 
      public void run() { 
       if(mClockStopped) return; 
       mCalendar.setTimeInMillis(System.currentTimeMillis()); 
       mClock.setText(DateFormat.format("hh:mm:ss", mCalendar)); 
       mClock.invalidate(); 
       long now = SystemClock.uptimeMillis(); 
       long next = now + (1000 - now % 1000); 
       mHandler.postAtTime(mTicker, next); 
      } 
     }; 
     mTicker.run(); 

     return view; 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     mClockStopped = true; 
    } 

    @Override 
    public void onPause() 
    { 
     mClockStopped = false;   
     super.onPause(); 
    } 

} 

ответ

2

Это потому, что вы остановили часы, установив mClockStopped = true; in onResume()

+0

Мне нужно отдохнуть. Благодарю. – jul

0

Удалить этот mTicker.run(); и создать Timer затем использовать этот метод для вызова TimerTask, вместо Runnable, каждый за одну секунду (1000 мс) scheduleAtFixedRate

+0

TimerTask не рекомендуется: http://developer.android.com/resources/articles/timed-ui-updates.html – jul

+0

Тогда почему бы не использовать 'postDelayed (java.lang.Runnable, long) 'вместо' mHandler.postAtTime (mTicker, next); 'и использовать 1000 мс? –

+0

Поскольку я хочу «запросить отметку на следующей жесткой второй границе», например, виджет DigitalClock (http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android /4.0.3_r1/android/widget/DigitalClock.java/?v=source). – jul

0

Вы путаете ваши времена .. . Handle.postAtTime занимает миллисекунды с момента загрузки (миллисекунды безотказной работы), тогда как вы предоставляете временную метку Unix (миллисекунды с 1 января 1970 года 00:00:00 по UTC).

+0

'long now = SystemClock.uptimeMillis();', так что все выглядит правильно. – jul