- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个非常依赖互联网的 android 应用程序,我经常使用这个检索数据 RestClient Class ,包含了一些关于使用 DefaultHttpClient 进行网络请求的细节。
而且我总是使用不同的线程来执行 HTTP 请求,我创建了一个这样的类:
public class AsyncWorker {
final String SERVER_URL = "http://api.blabla.com";
RestClient client = new RestClient();
public void requestHttp(final String url, final ArrayList<NameValuePair> params, final RequestListener listener) {
new Thread(new Runnable() {
public void run() {
try {
client.setUrl(url);
client.setParams(params);
client.Execute(RestClient.RequestMethod.POST);
String response = client.getResponse();
listener.onComplete(response);
} catch (Exception ex) {
Log.d("LOGIN", ex.getMessage());
}
}
}).start();
}
etc...
所以每当我需要做HTTP请求时,我只需要创建AsyncWorker
对象,并提供RequestListener
回调接口(interface)即可。
但问题是,当用户按下后退/取消按钮时,如何取消HTTP 请求?在这种情况下,应用程序仍然处于一个 Activity 中,例如,我创建了一个对话框,用户从该对话框发出请求,然后按下后退按钮,对话框被关闭,我需要取消那个时候的请求。
最佳答案
我遇到了同样的问题,并且能够找到解决办法。这是我所做的:
我使用了 CloseableHttpClient 和其他相关类,而不是默认情况下 Android 附带的 DefaultHttpClient。
这些类来自https://hc.apache.org/downloads.cgi .或直接访问:http://apache.mirrors.hoobly.com//httpcomponents/httpclient/binary/httpcomponents-client-4.3.2-bin.tar.gz
有了这个,调用 Request 对象的 abort() 方法实际上会停止连接。但是,使用这个库不是解决方案;原因是 Android 已经内置了过时的 HTTPCLIENT 库,并且上面链接指向的库中的大多数类在运行时似乎都丢失了。
问题在于上述库中的包和内置的 org.apache httpclient 包具有相同的命名空间,并且会导致在编译时仅使用 Android 提供的内置 org.apache 类。
此问题的示例可在此处找到:java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE .
感谢提供 http://code.google.com/p/httpclientandroidlib/ 的人作为一个选项(在 java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE 的答案部分找到)
建议:实际取消 http 请求的地方可以在进度对话框的 OnCancel 监听器中,而不是 AyncTask 的 onCancelled() 回调方法。
关于android - 如何在多线程中取消DefaultHttpClient执行过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007731/
我是一名优秀的程序员,十分优秀!