停止一个 HttpURLConnection 的连接。

3

这个问题之前曾经被问过并且得到回答,链接。但是该回答对我没有帮助。我的情况与其他帖子的原始发布者类似: 我有一个Asynctask,在其中连接到某个网站,然而,由于网络延迟问题,大多数情况下连接需要一些时间。 我想让用户随时停止尝试连接。

public class DownloadWebHtml extends AsyncTask<String, Void, Map<String,ArrayList<ArrayList<String>>>> {        
        HttpURLConnection con = null;

        @Override
        protected void onPreExecute(){
            Button but = (Button) findViewById(301);
            but.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    cancel(true);
                    con.disconnect();
                }
            });
        }

        @Override
        protected Map<String, ArrayList<ArrayList<String>>> doInBackground(String... urlcodes) {
            //stuff
            BufferedReader in = null;
            try {
                URL url = new URL("some url");
                con = (HttpURLConnection) url.openConnection();
                in = new BufferedReader(new InputStreamReader(con.getInputStream(),Charset.forName("ISO-8859-1")));
                String line = "";
                while ((line = in.readLine()) != null && !isCancelled()) {
                    html.add(line);
                }
                in.close();
            } catch (MalformedURLException e) {
                return null;
            } catch (IOException e) {
                return null;
            } finally {
                con.disconnect();
                 if (in != null) {
                     try {
                         in.close();
                     } catch (IOException e) {
                         Log.d("gettxt", e.getMessage());
                     }
                 }
            }

            if(!html.isEmpty()) {
                return //stuff;
            }
            return null;

        }

        @Override
        protected void onCancelled(){
            //cancellation
        }


    //onpostexecute doing stuff
}

每当按钮被按下时,整个AsyncTask只有在建立连接后才会被取消。是否可能在按钮按下时立即停止整个过程?可以使用默认的httpurlconnection来完成吗?
我尝试使用disconnect来触发异常,而此时con.getInputStream正在忙碌,但它未能起作用。
1个回答

1

3
在大多数情况下,http://android-developers.blogspot.com/2011/09/androids-http-clients.html 建议使用 HttpURLConnection 而不是 Apache 的。看起来您在代码中正在做与我相同的事情,但我没有问题随时取消 AsyncTask,尽管管道可能需要更长时间才能在后台关闭。 - Shellum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接