How to stop HttpURLConnection connect on Android

android, android-asynctask, httpurlconnection

Solution

Wrap the code that uses `HttpURLConnection` inside a `Future`, which you can cancel at will. You can also use the `Future`'s timeout feature, since the timeouts in `HttpURLConnection` are not reliable.

Define an executor and future within your networking class:

final ExecutorService executor = Executors.newCachedThreadPool(Executors.defaultThreadFactory());
Future<MyResult> future;

Then wrap your networking code inside the `Future` like this:

future = executor.submit(new Callable<MyResult>() {
    @Override
    public MyResult call() throws IOException {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        try {
            // .. use the connection ...
        } finally {
            connection.disconnect();
        }
    }
});

MyResult result = future.get(TIMEOUT, TimeUnit.SECONDS);

When you want to cancel, you can make this call from any thread:

future.cancel(true);

If the future times out or is canceled, the connection task may continue to block on a `HttpURLConnection` method, but your application won't be held back. You should still set appropriate timeouts on the connection to speed up freeing of threads and network sockets.

Problem

I use AsyncTask to connect an URLPath as below code. ``` @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.left_list); Button btn = (Button)findViewById(resid); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //how to stop connect } }); new Connecting().execute(); } class Connecting extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); //do something } @Override protected String doInBackground(String... aurl) { try { URL url = new URL(URLPath); connection = (HttpURLConnection)url.openConnection(); connection.setConnectTimeout(30000); connection.setReadTimeout(30000); connection.setDoInput(true); connection.setUseCaches(false); connection.connect(); is = connection.getInputStream(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String unused) { super.onPostExecute(unused); //access InputStream is } } ``` connection may spend much time in connect. While it connecting, I want to set the Bbutton btn is pressed to stop the connection connect. How can I set in setOnClickListener method?

Original source

Related problems