PopUpScreen Блокировка событий в Blackberry - PullRequest
1 голос
/ 08 февраля 2012

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

Вот как я создаю всплывающий экран и показываю его пользователю

    DialogFieldManager manager = new DialogFieldManager();
                        //DialogFieldManager manager = (DialogFieldManager)getDelegate();
                        statusUpdate = new LabelField("Please Wait...");
                        manager.addCustomField(statusUpdate);
                        _gaugeField = new GaugeField("", 0, 100, 0, GaugeField.PERCENT);
                        manager.addCustomField(_gaugeField);
                        cncl_Btn = new ButtonField("Cancel",ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER | ButtonField.NEVER_DIRTY);
                        manager.addCustomField(cncl_Btn);
                        cancelFlag = 0;
                        cncl_Btn.setChangeListener(new FieldChangeListener()
                        {

                            public void fieldChanged(Field field, int context) {
                                //  Auto-generated method stub
                                UiApplication.getUiApplication().invokeLater(new Runnable()
                                {               
                                    public void run()
                                    {
                                        cancelFlag = 1;
                                        //onClose();//as this method exited from application
                                       // close();//this method gave me IllegalStateException
                                    }
                                 });

                            }

                        });

                        //BackUpScreen.this.addMenuItem(_viewItem);
                        popup = new PopupScreen(manager);
UiApplication.getUiApplication().pushScreen(popup);

Вскоре после этой строки я вызываю фактический процесс загрузки в такой ветке, как эта

UiApplication.getUiApplication().invokeLater(new Runnable() { 
                            public void run() {
                                    //.... do other stuff I wanted done...
                                backUpThread = Thread.currentThread();
                                    uploadItems();


                            }
                    });

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

Как я могу сделать это в ежевике?

1 Ответ

2 голосов
/ 08 февраля 2012

Вызов invokeLater (int второй бит кода) вызывает выполнение Runnable в потоке событий.Если что-то, что вы делаете в потоке событий, блокируется, то пользовательский интерфейс перестанет отвечать на ваши запросы.Любые вызовы, которые могут блокировать, не должны выполняться в потоке событий.

...