2012-02-06 71 views
0

我想調用一個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,並且我已經測試過可以在瀏覽器中打開任何網站。我的代碼中有什麼問題?

回答

1

MDS必須啓動互聯網訪問,它將作爲模擬器和桌面互聯網連接之間的接口。

2

最好閱讀有關BlackBerry基礎結構的網絡。請看看BlackBerry文檔。

爲了讓您的代碼能夠快速工作 - 只需爲請求的網址添加後綴 - 「; interface = wifi」即可通過WiFi運行,或者使用「deviceside = false」通過無線電訪問。因此,您的原始網址將爲「http://www.google.com; deviceside = false」或「http://www.google.com; interface = wifi」。

2

也許你應該顯示屏幕,然後產生一個工作線程來完成連接。無論如何,您應該在OS> = 5.0中使用ConnectionFactory,以避免之前版本中管理此問題所需的「後綴的後綴」。另請注意,失敗的連接通常需要2分鐘才能超時。

+1

你真的應該(不,也許)在一個單獨的線程上運行http獲取。你所做的是讓事件線程(因此OS)阻塞等待getResponseCode()返回。自從您阻止操作系統後,它可能永遠不會執行此操作。 – Richard 2012-02-07 17:30:22

0

,當你在黑莓您的網址打開http連接 "http://www.google.com" 還應該包含連接suffix.so烏爾URL成爲形式的 "http://www.google.com"+connectionsuffix

,如果你有那麼正常的GPRS收拾你的網址成爲 「http://www.google.com」 + 「; deviceside = true」