gpt4 book ai didi

android - 如何在多线程中取消DefaultHttpClient执行过程

转载 作者:行者123 更新时间:2023-11-29 16:21:31 25 4
gpt4 key购买 nike

我正在开发一个非常依赖互联网的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com