"pushModalScreen called by a non-event thread" thrown on event thread
        Posted  
        
            by JGWeissman
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by JGWeissman
        
        
        
        Published on 2010-03-26T17:13:18Z
        Indexed on 
            2010/03/26
            19:53 UTC
        
        
        Read the original article
        Hit count: 350
        
blackberry
|gui
I am trying to get my Blackberry application to display a custom modal dialog, and have the opening thread wait until the user closes the dialog screen.
final Screen dialog = new FullScreen();
...// Fields are added to dialog
Application.getApplication().invokeAndWait(new Runnable()
{
    public void run()
    {
        Application.getUiApplication().pushModalScreen(dialog);             
    }
});
This is throwing an Exception which says "pushModalScreen called by a non-event thread" despite the fact that I am using invokeAndWait to call pushModalScreen from the event thread.
Any ideas about what the real problem is?
Here is the code to duplicate this problem:
package com.test;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
public class Application extends UiApplication {
    public static void main(String[] args)
    {
        new Application();
    }
    private Application()
    {
        new Thread()
        {
            public void run()
            {
                Application.this.enterEventDispatcher();
            }
        }.start();
        final Screen dialog = new FullScreen();
        final ButtonField closeButton = new ButtonField("Close Dialog");
        closeButton.setChangeListener(new FieldChangeListener()
        {
            public void fieldChanged(Field field, int context)
            {
                Application.getUiApplication().popScreen(dialog);
            }
        });
        dialog.add(closeButton); 
        Application.getApplication().invokeAndWait(new Runnable()
        {
            public void run()
            {
                try
                {
                    Application.getUiApplication().pushModalScreen(dialog);
                }
                catch (Exception e)
                {
                    // To see the Exception in the debugger
                    throw new RuntimeException(e.getMessage());
                }
            }
        });
        System.exit(0);
    }
}
I am using Component Package version 4.5.0.
© Stack Overflow or respective owner