2012-07-26 44 views
1

我想從J2ME midlet中調用一個Servlet,所以我編寫了Servlet URL的HTTPConnection代碼來調用GET方法。爲什麼J2ME Midlet Suite和HTTPConnection需要使用不同的線程

當MIDlet套件試圖連接到服務器URL,我已經得到了在模擬器中下面的消息,

{#MyMidlet} Midlet Suite wants to connect to {#Servlet URL} using air time, 
    this may result in charges, Is it ok to use airtime ? 

如果我點擊有或無,什麼都沒有發生,它剛剛絞死,我使用EclipseME和SUN WTK 2.5.2。並在控制檯中出現警告,

Warning: To avoid potential deadlock, operations that may block, such as 
networking, should be performed in a different thread than the 
commandAction() handler. 

這意味着,如果我做一個單獨的線程中爲HttpConnection,將問題解決呢?

+2

試試看! – funkybro 2012-07-26 07:27:49

+0

它的工作,當我改變HttpConnection在不同的線程。謝謝 !! – Murugesh 2012-07-26 13:47:40

+0

沒問題!雖然下次我只是自己嘗試一下,而不必在這裏發佈問題......節省了很多時間! – funkybro 2012-07-26 14:10:55

回答

2

如果我在一個單獨的線程中製作HttpConnection,問題是否會得到解決?

如果你做得對 - 是的,問題將得到解決。這是一個典型的問題,有一個獨特的解決方案。

警告您指的是指示您的midlet中的設計問題。您擁有與UI相同的線程運行的「重量級」活動(http連接),阻止它並使其無響應。

在UI事件線程中避免重載。當commandActionkeyPressedpointerPressed等內部有很多東西需要做時,只需創建一個新線程即可完成。爲了更好地理解這是爲什麼,考慮研究本教程以瞭解如何做是正確的:

Networking, User Experience, and Threads

本文介紹了你的MIDlet如何進行網絡連接,而不影響您的用戶界面。它包含六個迭代示例,說明多線程網絡和使用等待屏幕......

  • 教程(PrimitiveMidlet)的第一個例子後,有您所遇到的問題,甚至是一個詳細的解釋:

    ...程序員已經劫持了系統線程爲他自己冗長的處理。當用戶選擇一個命令時,系統調用他的commandAction()方法。調用此方法的線程屬於系統,而不屬於開發人員。如果方法執行得很快,這不會是犯罪,但在這種情況下,網絡連接可能會長時間佔用系統的線程。

    在J2SE應用程序,甚至在servlet編程,系統將爲您創建一個線程,也有你的處理可以多久一些限制。 MIDlet線程的規則是簡單而嚴格的:唯一屬於你的線程就是你自己創建的線程。

    在一個MIDlet,你寫的代碼,系統會從自己的線程上撥打電話。例如,當MIDlet的startApp(),pauseApp(),destroyApp()和事件處理程序方法被調用時,它們將在系統線程內運行。您的方法必須快速返回,以便系統線程可以繼續其他工作。任何無法快速完成的任務都必須移出系統的線程。

    這種編程方式可能需要一些時間來適應,因爲你真的只寫一個從系統的線程調用的代碼。但是,如果你已經完成了其他的GUI編程,這種技術將會很熟悉。 AWT和Swing有一個事件分派線程,它處理操作系統事件並在代碼中調用事件處理程序。規則是一樣的:事件處理程序應該迅速執行並返回控制到事件調度線程使接口的其餘部分沒有鎖定...

  • 在教程中顯示
另外的代碼示例如何解決設計錯誤,類似於以及如何使MIDlet用戶界面順暢地與網絡活動進行互操作。

-2


在J2ME中網絡操作放在單獨的線程中。
U將網絡模塊置於單獨線程中。如果將網絡模塊置於單獨線程中,則不會顯示以下消息。

Warning: To avoid potential deadlock, operations that may block, such as 
networking, should be performed in a different thread than the 
commandAction() handler. 


在J2ME(太陽/ ORACLE誰是J2ME的所有者)給出了一些limitations.For安全一些API的需要可信方certificates.For一些這方面的手機詢問用戶權限時,用戶點擊是,那麼它會允許,否則不允許。
以下是API下的一些場景,包括FileConnection(讀/寫文件)api,HttpConnection,HttpsConnection等。
U檢查您的設備是否支持自簽名證書。如果是支持方式,請使用自簽名證書。
可信方證書是昂貴的。其最低的成本爲10000 Ruppees每year.The以下是一些值得信賴方供應商Thawte的,Verizon公司,Semantec等

+1

所有的東西/權限是正確的,但不相關的 - 問題是無關的證書。 – funkybro 2012-07-26 10:24:34

1

創建其作爲一個單獨的線程像這樣的連接:

Thread myConnection = new Thread(new Runnable() { 

     public void run() { 
      // TODO open connection here 


      HttpConnection conn = null; 

      try { 

         conn = (HttpConnection) Connector.open(serverURL, 
           Connector.READ_WRITE, true); 

         conn.setRequestMethod(HttpConnection.GET); // or POST method 

        } catch (Exception e) { 

       // TODO: handle exception 

      } finally { 

       // close connection here 
      } 

     } 
    }); 
    myConnection.start(); 
+0

謝謝你的回答,以我試過的類似的方式開始工作。你能告訴我,爲什麼當它們都在一個線程中時,就像這樣給出信息。 – Murugesh 2012-07-26 13:50:11

+0

每個製造商定義你將如何處理它。這不是強制性的。例如,在仿真器WTK 2.5.2中,他對KVM進行仿真,主線程負責繪製。建議使用好的做法,但不要強制爲事件I/O使用單獨的線程。想象一下,當服務器不響應請求時,僅使用主線程運行應用程序(客戶端/服務器)...可能會危及繪製的響應屏幕上。 – 2012-07-26 14:57:13

+0

然後,WTK模擬器強制執行一個單獨的線程方法來運行。但真正的設備不是必需的。但是,在處理事件I/O時應小心。 – 2012-07-26 14:59:09

相關問題