Как отобразить часы обратного отсчета всего приложения на Blackberry? - PullRequest
4 голосов
/ 16 декабря 2011

Я делаю и показываю счетчик часов с этим кодом

LabelField time;
            long mille=0;
            Timer timer=null;TimerTask task=null;
            public Timerscreen() {
                mille=1000*60*1;
                time=new LabelField();
                add(time);
                timer=new Timer();

                task=new TimerTask() {

                    public void run() {
                        synchronized (UiApplication.getEventLock()) {

                            if(mille!=0){
                                SimpleDateFormat date=new SimpleDateFormat("mm:ss") ;
                                System.out.println("================="+date.formatLocal(mille)+"====================="+Thread.activeCount());
                                time.setText(date.formatLocal(mille));
                                mille=mille-1000;
                            }else{
time.setText("00:00");
mille=1000*60*1;
                                timer.cancel();
                                UiApplication.getUiApplication().invokeLater(new Runnable() {
                                    public void run() {
                                        Dialog.inform("Time expaired");
                                    }
                                });

                            }
                        }
                    }
                };
                timer.schedule(task,0, 1000);

И когда я нажимаю новый экран, я хочу, чтобы эти часы все еще отображались и вели обратный отсчет. Как я могу это сделать ?

1 Ответ

1 голос
/ 18 декабря 2011

Невозможно добавить один пользовательский интерфейс field или manager в два manager s или screen s .. каждый пользовательский интерфейс field или manager должен иметь не более одного родителя (screen или manager).

Так что, если вам нужен LabelField, который будет удерживать и показывать время на разных screen с, то вам нужно только реализовать какой-то тип слушателя, который будет прослушивать изменения времени ... и для каждого изменения, которое вам нужно обновите screen и LabelField с новым значением. Вы уже внедрили TimerTask, который предоставит вам обновленные данные.

[Отредактировано - добавлено позже]

вы можете проверить следующие коды, не проверенные, но что-то вроде этого решит вашу проблему ...

class MyTimerUtil {
    TimerListener listener = null;

    public MyTimerUtil() {      
    }

    public void setTimerListener(TimerListener listener) {
        this.listener = listener;
    }

    public void startTimer() {
        final int interval = 1000;
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            public void run() {
                // add your codes..

                // notify others
                if (listener != null) {
                    listener.timeChanged();
                }
            }
        };
        timer.schedule(task, 0, interval);
    }
}


interface TimerListener {
    public void timeChanged();
}

class ScreeA extends MainScreen implements TimerListener {

    public void timeChanged() {
        // add Codes here on time changed event     
    }   
}

В приведенном выше фрагменте вы можете реализовать интерфейс TimerListener в любом экземпляре экрана и получать обновления при каждом изменении события классом MyTimerUtil. Для этого вам нужно установить экземпляр ScreeA (который реализует TimerListener) через setTimerListener() класса MyTimerUtil.

Также необходимо запустить таймер, вызвав метод startTimer().

...