我的要求是在应用程序起始点解析两个URL,这两个URL包含需要在我的应用程序中显示的数据。我这样做是通过在一个数组中保留两个url并在后台线程中运行for循环然后将值插入后台线程的数据库中,这是解决问题的正确方法吗?
我在下面发布了我的代码,欢迎任何形式的帮助:)
public StartConnecton(SplashScreen splashScreen)
{
urls = new String[2];
urls[0] = "http:xxxxxx.com";
urls[1] = "http:yyy.com";
_dbIRef = new ClassDatabase(1);
_dbIRef.setSID(46);
_splashScreen = (SplashScreen)splashScreen;
_classDatabase = new ClassDatabase();
}
public void run()
{
int size = urls.length;
for(int i = 0; i < size;i++)
{
if(i==0)
{
_id= 1;
}else if(i==1)
{
_id = 0;
}
try{
String conn = this.getConnectionString();
con = (HttpConnection)Connector.open(urls[i]+getConnectionString());
con.setRequestMethod(HttpConnection.GET);
con.setRequestProperty("User-Agent","Profile/MIDP-1.0 Confirguration/CLDC- 1.0");
System.out.println("CONNECTION!!!!!!!!!!!"+con);
code = con.getResponseCode();
System.out.println("CODE!!!!!!!!!!!"+code+"ID"+_id);
if ( code == HttpConnection.HTTP_OK)
{
is = con.openInputStream();
int length = (int) con.getLength();
new Parser(is,_id);
is.close();
con.close();
}
}catch(Exception e)
{
System.out.println("EXCEPTION!!!!!!!!!!"+e);
}
}
_classDatabase.delete("Delete from topnews where sid = 46");
_classDatabase.insertTopNews();
_classDatabase.insertTabBar();
_classDatabase.insertGalleryInfo();
_topNewsScreen = new TopNewsScreen("TopNews");
_splashScreen.swapScreen(_topNewsScreen);
}
欢迎任何形式的帮助
A Y
答案 0 :(得分:2)
您目前遇到的问题是:
<强> 1。连接按顺序实例化。 如果第一个失败(服务器不存在,BlackBerry MDS服务器关闭等),那么在尝试第二个连接之前,您必须等待大约30秒才能使connection.open请求超时。
<强> 2。用户界面将在连接尝试期间冻结。我猜你也在事件线程上这样做,这意味着应用程序将在Connection.open
运行时冻结,因为此方法会阻塞。
上述两个问题的解决方案是将每个连接尝试包装到单独的线程中。这是一个很好的例子:http://mnarinsky.blogspot.com/2011/03/blackberry-sending-http-request-in.html
第3。冗余代码那个if(i==0)
代码块在做什么?如果你想要做的就是当i == 0时make _id = 1,那么就做_id = (i==0) ? 1 : 0;
。或者,颠倒将URL放入数组的顺序,只需使用i,然后完全删除_id变量。