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?