如何停止Android上的HttpURLConnection连接

我使用AsyncTask连接一个URLPath作为下面的代码。

@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 } } 

连接可能会花费很多时间连接。
当它连接时,我想设置Bbutton btn被按下来停止连接连接。
我如何设置setOnClickListener方法?

Solutions Collecting From Web of "如何停止Android上的HttpURLConnection连接"

Future包装使用HttpURLConnection的代码,你可以随意取消。 您也可以使用Future的超时function,因为HttpURLConnection中的超时并不可靠。

在你的networking课堂中定义一个执行者和未来:

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

然后把你的networking代码包装在Future像这样:

 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); 

当你想取消,你可以从任何线程进行此调用:

 future.cancel(true); 

如果将来超时或被取消,连接任务可能会继续阻塞HttpURLConnection方法,但您的应用程序不会被阻止。 您仍然应该在连接上设置适当的超时,以加快释放线程和networking套接字。