我想調用一個url,並從我的黑莓應用程序的URL獲取響應數據。爲此,我使用HttpConnection
。這裏是我使用的代碼:在黑莓HttpConnection概要在模擬器中運行
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Dialog;
import javax.microedition.io.Connector;
import javax.microedition.io.ContentConnection;
import javax.microedition.io.HttpConnection;
import java.io.DataInputStream;
import java.io.IOException;
public class TestApp extends UiApplication {
private MainScreen _mainScreen;
private static TestApp _app;
public TestApp(){
_mainScreen = new MainScreen();
LabelField testField = new LabelField("hello world");
_mainScreen.add(testField);
pushScreen(_mainScreen);
HttpConnection c = null;
DataInputStream dis = null;
try {
System.out.println("0");
c = (HttpConnection)Connector.open("http://www.google.com");
System.out.println("1");
int rc = c.getResponseCode();
System.out.println("2");
if (rc != HttpConnection.HTTP_OK) {
throw new IOException("HTTP response code: " + rc);
}
System.out.println("3");
dis = c.openDataInputStream();
System.out.println("4");
int len = (int)c.getLength();
if (len > 0) {
byte[] data = new byte[len];
dis.readFully(data);
} else {
int ch;
while ((ch = dis.read()) != -1) {
//...
}
}
} catch(Exception e){
e.printStackTrace();
}finally {
try {
if (dis != null)
dis.close();
if (c != null)
c.close();
} catch (IOException e) {
e.printStackTrace();
}
catch(NullPointerException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
_app = new TestApp();
_app.enterEventDispatcher();
}
}
當我嘗試運行模擬器的代碼,我得到「0」,那麼「1」之後,經過很長一段時間「沒有堆棧跟蹤」是一個出現調試窗口,只要文本出現,帶有文本的關卡應用程序就會在模擬器屏幕中可見。在模擬器的互聯網連接中沒有問題,我已經設置了Wi-Fi,並且我已經測試過可以在瀏覽器中打開任何網站。我的代碼中有什麼問題?
你真的應該(不,也許)在一個單獨的線程上運行http獲取。你所做的是讓事件線程(因此OS)阻塞等待getResponseCode()返回。自從您阻止操作系統後,它可能永遠不會執行此操作。 – Richard 2012-02-07 17:30:22