2011-09-04 51 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

相关问题