2010-08-12 92 views
0

我試圖做一些異步編程,但我的Java技能有點生疏...Java事件:慢速網絡

這裏是我的代碼:

private static String uname="xxx"; 
    private static String pword="xxx"; 
    private static int productId=82; 
    private static String sessionToken=""; 

    public static void main(String[] args) 
     { 
      BFGlobalService_Service service=new BFGlobalService_Service(); 
      BFGlobalService betfair=service.getBFGlobalService(); 

      System.out.println("hello"); 

      LoginReq loginReq=new LoginReq(); 
      loginReq.setUsername(uname); 
      loginReq.setPassword(pword); 
      loginReq.setProductId(productId); 
      loginReq.setLocationId(0); 
      loginReq.setVendorSoftwareId(0); 

      LoginResp loginResp=new LoginResp(); 
      loginResp=betfair.login(loginReq); //this line is very slow ;(
      sessionToken=loginResp.getHeader().getSessionToken(); 

      ... 
     } 

行「loginResp = betfair.login(loginReq)「需要時間(我有一個非常緩慢的3G網絡)並支持整個程序流程。完成後可以舉辦活動嗎?

即我想這樣的事件處理程序的僞碼:

private void handleNewLoginResp(...) 
{ 
    System.out.println("login response received"); 
    sessionToken=loginResp.getHeader().getSessionToken(); 
} 

我希望這將是夠爽快!我試着用搜索引擎,但所有我能找到的關於GUI的物品等enter code here

回答

0

閱讀上Java Concurrency。假設你有一個用戶界面,你會想要使用SwingWorker,或者任何功能等同於你的環境。

更新:

可能會發覺你是一個監聽器會在後臺線程的上下文中調用的唯一的一部分,而不是主線程的。因此,您需要使用同步塊來確保在後臺線程上創建的對象從線程的緩存刷新到公共內存。

這與爲GUI編寫custom event handling沒有區別。 (這就是爲什麼當你搜索時你沒有找到任何東西。)

+0

嗨,謝謝你。好。我將閱讀Java併發性。我有一個好主意,就是我多年以來沒有用Java來完成它。不,我沒有使用用戶界面。這個程序將運行在我的服務器上。 – Eamorr 2010-08-12 14:35:24

0

如果沒有可用的login()功能的非阻塞版本,你應該在一個單獨的線程中運行它,併火了完成後的事件。

請注意,使用多線程意味着您必須考慮併發問題。 您需要查看線程安全,java​​關鍵字和監聽器等內容。

(監聽器(或事件偵聽器)都是非必要的,但他們的設計理念,你需要做一個精心設計的解決方案。)