2011-04-03 23 views
1

我正在嘗試編寫一個正在進行大量網絡連接的MIDP應用程序。這一切都是通過HttpURLConnection完成的(這是所有此平臺支持的; Socket不起作用)。導致問題的主要部分是通過一組HTTP連接傳輸InputStream和OutputStream的代碼,以便每次讀寫都變成一個單獨的POST請求。MIDP中的複雜網絡:如何關閉URLConnection

我發現雖然在MIDP中做網絡連接並不算太壞,停止在MIDP中做網絡連接是一場噩夢。我發現我結束了很多線程,所有這些線程在read()或write()上都被阻塞,並且找到它們並且殺死真的很難。 Thread.interrupt()在Java的InputStream.read()和OutputStream.write()中不起作用並且在Stream上調用close()並不總是可行,因爲流可能被隱藏在內部URLConnection和URLConnection本身沒有辦法告訴它關閉連接。

這並不能幫助我的平臺瘋狂挑剔的清理。如果我在應用程序退出系統重新引導時離開一個線程運行。我懷疑它是在與主設備UI相同的虛擬機中運行我的midlet。

所以:任何人都可以提出一個合適的結構,我應該採用這種方式來簡化這種事情嗎?因爲現在它變成了線程的分形迷宮,並捕獲塊和中斷以及IOException,我正在迅速失去它應該如何工作的軌跡。

另外,包裝URLConnection的一個很好的事件驅動的IO庫會很方便。唉,這是MIDP,所以nio或頻道或類似的東西不是一種選擇。

編輯:更新:原來,這是 MIDP畢竟,這是PBP 1.1。啊,文件不足的樂趣。儘管如此,它們並不太相似,並且供應商告訴我們,唯一可用的網絡系統是HttpURLConnection。

+1

我假設你引用的是MIDP連接和HttpConnection而不是Java SE URLConnection和HttpURLConnection? – ThomasRS 2011-04-03 23:01:22

+0

嗯。這很有趣---我*指的是URLConnection。該設備非常奇怪,並且具有完全定製的MIDP實現(因此我的痛苦很大);我沒有關於哪些類支持的明確列表。顯然,他們正在混合一些SE東西。這是否會讓我的工作變得更難或更糟......? – 2011-04-04 09:50:17

+0

糟糕得多;因爲我猜這意味着你被一個設備卡住了,它不起作用。您應該檢查某些類型的線程(如來自系統事件)是否無法聯網 - 但是您可能會看到網絡模塊崩潰,深入設備內部並且無法訪問。更新到最新的固件或提交錯誤。你有我的同情心.. – ThomasRS 2011-04-04 10:57:21

回答

1

您將遇到不同的網絡問題,不僅涉及不同的手機,還會因不同的配置和運營商,固件,網絡和網絡條件而出現問題。

也就是說,你可以自由地使用套接字來實現一個HTTP客戶端 - 你的假設在除最老的手機之外的所有手機上都不是真的。你也應該看看Connection.close()方法。我目前使用以下密切的方法,這是簡單但有效的:

public void close() { 
    if (inputStream != null) { 
     try { 
      inputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      inputStream = null; 
     } 
    } 
    if (outputStream != null) { 
     try { 
      outputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      outputStream = null; 
     } 
    } 
    if (connection != null) { 
     try { 
      connection.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      connection = null; 
     } 
    } 
    closed = true; 
} 

如果這不起作用,你註定要失敗。換句話說,您不應該認爲您將能夠在所有MIDP手機上完美地運行您的MIDP - 因爲您不會。設計大圖,不要花時間調試絕望的MIDP實現。

您可能想同步。

+0

好吧,所以事實證明我沒有使用MIDP的連接,我正在使用Java SE的URLConnection(它們以某種方式楔入設備)。對困惑感到抱歉。 URLConnection沒有close()方法,雖然HttpURLConnection有一個disconnect(),但是這並沒有做我想要的...任何想法? – 2011-04-04 09:59:35