2011-09-04 53 views
2

我調用abort(),並且在execute()中阻塞的線程不會解除阻塞,直到超時併發生異常。它可能需要10秒以上,所以這是一個很大的問題。Android(2.1)HttpGet.abort()不工作

我環顧了一會兒,我無法找到答案。

文檔說abort()應該導致execute()阻止I/O立即解除阻塞。研究表明,這個問題剛剛解決。

當然,我從不同的線程調用abort()和execute()。我的代碼沒有特別之處,所以我不會浪費空間列出它。

我發現的一些帖子暗示了與HttpClient下方的套接字等有關的內容,但是這些內容都不起作用。

回答

0

你只是想讓HttpGet在已知的時間之後超時,或者你有什麼理由必須嘗試取消get?我懷疑中止只有在響應流正在閱讀...才能正常工作,如中止長時間下載。您可以嘗試使用URLConnection而不是HttpGet,它允許您獨立設置讀取和連接超時。

URL url= new URL(urlString); 
     URLConnection conn = url.openConnection(); 
     conn.setConnectTimeout(getInstance().getConnectionTimeout()); 
     conn.setReadTimeout(getInstance().getReadTimeout()); 
     if (encodedPostargs != null) 
     { 
      conn.setDoOutput(true); 
      OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); 
      out.write(encodedPostargs); 
      out.flush(); 
      out.close(); 
     } 
     return new BufferedReader(new InputStreamReader(conn.getInputStream())); 
+1

謝謝您的建議。我不需要超時,我想讓用戶取消一個http請求,如果他們願意的話。我想我找到了問題:當我中止時線程不在I/O調用中,它在TrustManager構造函數中。這是有道理的,因爲我使用的是https。我會進一步研究它,但是這個具體問題已經解決,因爲它不是真正的問題。 Oopsies ... – Jin

+1

更新:是的,我剛剛將keystore init代碼移到了發生在執行execute()之前的地方。 abort()的工作方式與阻塞I/O一樣。現在唯一的問題是由於密鑰庫初始化,應用程序啓動緩慢。我猜想一個啓動畫面或一些不可取消的進度指示器將是... – Jin

相關問題