挂起(异常IlegalStateException)blackberry 6.0

挂起(异常IlegalStateException)blackberry 6.0,blackberry,java-me,blackberry-jde,Blackberry,Java Me,Blackberry Jde,以下是显示调试时出现上述异常的代码: 首先,我试图从下面的菜单项调用一个类HTTPConnection protected MenuItem _SelectDealerItem = new MenuItem("Select Dealer",100,10) { public void run() { new HTTPConnection(); } }; 在HTTPConnection类中,我正在检查连接类型并调用另一个类TSelectDealerScree

以下是显示调试时出现上述异常的代码:

首先,我试图从下面的菜单项调用一个类HTTPConnection

protected MenuItem _SelectDealerItem = new MenuItem("Select Dealer",100,10)
{
    public void run()
    {
        new HTTPConnection();
    }
};
在HTTPConnection类中,我正在检查连接类型并调用另一个类TSelectDealerScreen:

public class HTTPConnection {

ConnectionFactory _factory = new ConnectionFactory();

public HTTPConnection()
{
    int[] _intTransports = {
            TransportInfo.TRANSPORT_TCP_WIFI,
            TransportInfo.TRANSPORT_WAP2,
            TransportInfo.TRANSPORT_TCP_CELLULAR
    };

    for(int i=0;i<_intTransports.length;i++)
    {
        int transport = _intTransports[i];
        if(!TransportInfo.isTransportTypeAvailable(transport)||!TransportInfo.hasSufficientCoverage(transport))
        {
            Arrays.removeAt(_intTransports,i);
        }
    }

    TcpCellularOptions tcpOptions = new TcpCellularOptions();

    if(!TcpCellularOptions.isDefaultAPNSet())
    {
        tcpOptions.setApn("My APN");
        tcpOptions.setTunnelAuthUsername("user");
        tcpOptions.setTunnelAuthPassword("password");
    }

    if(_intTransports.length>0)
    {
        _factory.setPreferredTransportTypes(_intTransports);
    }

    _factory.setTransportTypeOptions(TransportInfo.TRANSPORT_TCP_CELLULAR, tcpOptions);
    _factory.setAttemptsLimit(5);

    Thread t = new Thread(new Runnable()
    {
        public void run()
        {
            ConnectionDescriptor cd = _factory.getConnection("http://excellentrealtors.info/Smart-Trace/get_dealer.php");
            if(cd!=null)
            {
                Connection c = cd.getConnection();
                displayContent(c);
            }
        }
    });
    t.start();
}

private void displayContent(final Connection conn)
{
    UiApplication.getUiApplication().pushScreen(new TSelectDealerScreen(conn));
}
}

在您的
HTTPConnection
类中,您需要:

Thread t =  new Thread(new Runnable()
{
    public void run()
    {
        ConnectionDescriptor cd =   _factory.getConnection("http://excellentrealtors.info/Smart-Trace/get_dealer.php");
        if(cd!=null)
        {
            Connection c    =   cd.getConnection();
            displayContent(c);
        }
    }
});
t.start();
它在后台线程上运行
run()
中的所有内容。但是,在
displayContent(c)
中,您可以:

UiApplication.getUiApplication().pushScreen(new TSelectDealerScreen(conn));
这是一个UI操作

尝试从后台线程修改UI通常会导致
非法状态异常

我相信您只需要将调用
pushScreen()
包装为以下内容:

private void displayContent(final Connection conn) {

    final UiApplication app = UiApplication.getUiApplication();
    app.invokeLater(new Runnable() {
       public void run() {
          // this code is run on the UI thread
          app.pushScreen(new TSelectDealerScreen(conn));
       }
    });
}
另外,如果您是一名Android开发人员,并且希望得到帮助来完成正常的后台/UI线程工作,那么您可能需要帮助

private void displayContent(final Connection conn) {

    final UiApplication app = UiApplication.getUiApplication();
    app.invokeLater(new Runnable() {
       public void run() {
          // this code is run on the UI thread
          app.pushScreen(new TSelectDealerScreen(conn));
       }
    });
}