Прокрутка диспетчера полей Blackberry показывает исключение NullpointerException

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

Экран графического интерфейса

В прослушивателе изменения поля кнопки я удаляю левый VFM, затем отображается только кнопка «Домой», а в прослушивателе кнопки «Домой» я добавляю левый VFM, затем он возвращается к показанному выше экрану.

Проблема возникает после прокрутки левого содержимого и удаления левого VFM. Затем отображается только кнопка «Домой», а навигация по панели треков (прокрутка) приводит к экрану исключения нулевого указателя. На следующем рисунке показан снимок экрана симулятора с ошибкой.

ЭКРАН ОШИБОК

А вот и полный исходный код для воспроизведения ошибки.

public class MyApp extends UiApplication{
    public static void main(String[] args)
    {
        // Create a new instance of the application and make the currently
        // running thread the application's event dispatch thread.
        MyApp theApp = new MyApp();       
        theApp.enterEventDispatcher();
    }

    /**
     * Creates a new MyApp object
     */
    public MyApp()
    {        
        // Push a screen onto the UI stack for rendering.
        pushScreen(new MyScreen());
    }
}

public final class MyScreen extends MainScreen{

    private HorizontalFieldManager hfmMainManager = null;
    
    private VerticalFieldManager menuButtonManager = null;
    
    private String[] buttons = new String[]{"BUTTON ID 1",
            "BUTTON ID 2",
            "BUTTON ID 3",
            "BUTTON ID 4",
            "BUTTON ID 5",
            "BUTTON ID 6",
            "BUTTON ID 7",
            "BUTTON ID 8",
            "BUTTON ID 9",
            "BUTTON ID 10"};
    
    private boolean menuShowing = false;
    
    /**
     * Creates a new MyScreen object
     */
    public MyScreen()
    {        
        super( Manager.NO_VERTICAL_SCROLL | MainScreen.NO_VERTICAL_SCROLLBAR
                | Manager.NO_HORIZONTAL_SCROLL | Manager.NO_HORIZONTAL_SCROLLBAR);
        
        hfmMainManager = new HorizontalFieldManager(Manager.NO_HORIZONTAL_SCROLL
                | Manager.NO_HORIZONTAL_SCROLLBAR);
        
        ////////////////////MENU BUTTONS
        menuButtonManager = new VerticalFieldManager(Manager.NO_VERTICAL_SCROLL | Manager.NO_VERTICAL_SCROLLBAR);
        
        menuButtonManager.add(new ButtonField("Header Button", Field.FIELD_HCENTER));
        VerticalFieldManager vfmScrollable = new VerticalFieldManager(Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR);
        for (int i = 0; i < buttons.length; i++) {
            
            ButtonField buttonField = new ButtonField(buttons[i], Field.FIELD_HCENTER);
            buttonField.setChangeListener(listenerButton);
            vfmScrollable.add(buttonField);
        }
        menuButtonManager.add(vfmScrollable);
        
        hfmMainManager.add(menuButtonManager);
        
        
        VerticalFieldManager vfmMenuContentManager = new VerticalFieldManager(Manager.NO_VERTICAL_SCROLLBAR | Manager.NO_VERTICAL_SCROLL);
        

        ButtonField buttonField = new ButtonField("Home Button", Field.FIELD_HCENTER);
        buttonField.setChangeListener(listenerButton);
        buttonField.setMargin(10, 0, 10, 0);
        vfmMenuContentManager.add(buttonField);
        
        hfmMainManager.add(vfmMenuContentManager);
        
        add(hfmMainManager);
        
        menuShowing = true;
    }


    private FieldChangeListener listenerButton = new FieldChangeListener() {

        public void fieldChanged(Field arg0, int arg1) {
            
            synchronized (UiApplication.getEventLock()) {
                if(menuShowing){
                    menuShowing = false;
                    hfmMainManager.delete(menuButtonManager);
                }else{
                    menuShowing = true;
                    hfmMainManager.insert(menuButtonManager, 0);    
                }
            }
        }
    };
}

Как решить эту проблему?

заранее спасибо

С Уважением

Аниш


person MobDev    schedule 11.02.2013    source источник


Ответы (1)


Я видел подобное поведение при попытке изменить структуру поля из события фокуса или расфокусировки. Когда поле удаляется с экрана в середине события фокуса, отслеживание фокуса может рассинхронизироваться и вызвать необычные ошибки, подобные этой. Попробуйте вместо этого перейти от захвата блокировки пользовательского интерфейса к вызову invokeLater. Таким образом, слушатель изменений может завершить выполнение до того, как вы удалите VFM, сохранив все инварианты на своих местах.

Избавьтесь от этого:

synchronized (UiApplication.getEventLock()) {

Замените это на это:

UiApplication.getInstance().invokeLater(new Runnable{ public void run() {
person Michael Donohue    schedule 11.02.2013
comment
Привет, я заменил синхронизированный (UiApplication.getEventLock ()) на UiApplication.getInstance (). InvokeLater (new Runnable {public void run () {.... Но проблема все еще существует. - person MobDev; 12.02.2013