挂起(异常IlegalStateException)blackberry 6.0
以下是显示调试时出现上述异常的代码: 首先,我试图从下面的菜单项调用一个类HTTPConnection挂起(异常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
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));
}
});
}