【问题标题】:Blackberry Field Manager Scrolling Shows NullpointerException黑莓字段管理器滚动显示 NullpointerException
【发布时间】:2013-02-11 10:58:41
【问题描述】:

我在使用 Blackberry 水平和垂直字段管理器时遇到问题。在我的示例应用程序中,我将两个垂直字段管理器添加到一个水平字段管理器中,GUI 如下图所示。

在按钮的字段更改侦听器中,我正在删除左侧 VFM,然后仅显示 Home 按钮,在主页按钮侦听器中,我正在添加左侧 VFM,然后返回到上面的屏幕。

问题出现在滚动左侧内容并删除左侧 VFM 后,然后仅显示 Home 按钮,并且触控板导航(滚动)导致 Null Pointer 异常屏幕。下图为模拟器报错截图。

这里是重现错误的完整源代码。

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);    
                }
            }
        }
    };
}

我该如何解决这个问题?

提前致谢

问候

阿尼什

【问题讨论】:

    标签: blackberry blackberry-simulator blackberry-jde


    【解决方案1】:

    我在尝试从焦点或非焦点事件更改字段结构时看到了类似的行为。当一个字段在焦点事件中间从屏幕上移除时,焦点跟踪可能会不同步,并导致类似这样的异常错误。尝试从获取 UI 锁改为调用 invokeLater。这样,更改侦听器可以在您删除 VFM 之前完成执行,从而保留所有不变量。

    摆脱这个:

    synchronized (UiApplication.getEventLock()) {
    

    用这个替换它:

    UiApplication.getInstance().invokeLater(new Runnable{ public void run() {
    

    【讨论】:

    • 您好,我已将同步 (UiApplication.getEventLock()) 替换为 UiApplication.getInstance().invokeLater(new Runnable{ public void run() {.... 但问题仍然存在。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多