停止HttpURLConnection连接

时间:2012-10-31 15:19:55

标签: android android-asynctask httpurlconnection cancellation

这个问题在前一段时间被问及并回答link。然而,答案对我没有帮助。我与另一篇文章的OP处于同一位置: 我有一个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吗?

我尝试使用断开连接在con.getInputStream忙时触发异常,但无法正常工作。

1 个答案:

答案 0 :(得分:1)

我建议切换到Apache的HTTP Components。它具有魅力,并且具有线程安全的abort方法,如outlined here