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

标签 android multithreading httpclient

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

相关文章:

具有处理程序和线程的 Android 服务

java - List 类型不是通用的;它不能用参数 [HTTPClient] 参数化

java - HttpClient HTTP/1.1 302 对象已移动

android - 今天我尝试 viewBinding 但最终出现错误

android - 如何在 Android Studio 中高亮显示 Room Dao 的 SQL 语法

c# - 应该在 ReaderWriterLockSlim 锁上调用 Dispose() 吗?

java - Android HttpClient 持久性 cookie

java - 如何设置 Eclipse 编辑器屏幕和包资源管理器 View ?

android - AppBarLayout 阻止 RecyclerView 在 BottomSheet 中滚动

ios - 繁重的 CPU 处理以加热设备