【发布时间】:2011-04-07 06:11:14
【问题描述】:
在我的应用程序中,我需要建立与 Web 服务器的 Http 连接,当用户选择 ListField 元素时会建立 http 连接。它工作正常,我编写了一个建立 http 连接的方法,它返回一个结果,我的程序处理这些数据。
但它挂起 UI,因为我编写的方法不是在单独的线程中(我编写的建立 http 连接的方法是在单例类中)。现在我在一个单独的线程中更改了我的方法,现在我得到了非法线程状态异常。
所以我更改了我的类(HttpConnection 类-现在它不是单例),现在没有非法状态异常,但我没有得到我想要的结果。
我对java和blackberry的经验比较少,不知道怎么同步两个线程。所以我引入了一个静态变量'i',当程序进入线程时它变为0,当它得到http响应时它变为1。
所以 in 使用 while 循环等待我的程序并检查 i 值。当它变为 1 时,我收到 http 响应(这也是一个静态字符串变量)。但是现在我的程序也无限期挂起,我知道这不是一个好方法。
请通过分享您关于线程同步、链接代码等的想法来帮助解决问题。
这是我的运行方法:
public void run() {
i =0;
observerStatusUpdate(i, "Please Wait");
StreamConnection streamConnection=null;
InputStream inputStream=null;
HttpConnection httpConnection = null;
String result="";
try {
streamConnection=(StreamConnection)Connector.open(url);
httpConnection=(HttpConnection)streamConnection;
httpConnection.setRequestMethod(HttpConnection.GET);
//httpConnection.setRequestProperty("Content-Type", "//json");
int httpStatus=httpConnection.getResponseCode();
if(httpStatus==HttpConnection.HTTP_OK){
inputStream = streamConnection.openInputStream();
//byte[] radioTimeData=new byte[8000];
byte radioTimedataByte;
while((radioTimedataByte=(byte)inputStream.read())!=-1){
result=result+(char)radioTimedataByte;
}
httpres = result;
setResult(result);
i=1;
observerStatusUpdate(i, "");
}
} catch (IOException e) {
i=1;
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
Dialog.alert("No Internet Connectivity");
//System.exit(0);
}
});
System.out.println(e);
}
它使用另一个类来调用,例如
grabAPIFactory.setUrl(newUrl,o1);
grabAPIFactory.start();
grabAPIFactory.setPriority(Thread.MAX_PRIORITY);
while(GrabapiFactory.i==0){
Thread.sleep();
}
string httpresult = GrabapiFactory.httpres;// static variale getting result from server
// process the httpresult here.....
【问题讨论】:
-
段落和一些说明您的问题的代码可能会有所帮助。
-
没有看到你代码的相关部分,我们只能猜测是什么问题。
-
由于我的代码比较长,所以没有添加,谢谢
标签: blackberry java-me