Runnable для запуска каждую секунду запускается только один раз во Fragment onCreateView () - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь обновить время в TextView с Runnable, который должен запускаться каждую секунду.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();
    }

}

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

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

0 голосов
/ 26 марта 2012

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

0 голосов
/ 26 марта 2012

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

...