如何在Android上停止HttpURLConnection连接

bri*_*ian 12 android httpurlconnection android-asynctask

我使用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
        }
}
Run Code Online (Sandbox Code Playgroud)

连接可能会花费很多时间在连接上.
在连接时,我想设置Bbutton按下btn来停止连接连接.
如何在setOnClickListener方法中设置?

Edw*_*rey 21

包含HttpURLConnection在a内使用的代码,Future您可以随意取消.您还可以使用Future超时功能,因为超时HttpURLConnection不可靠.

在网络类中定义执行者和未来:

final ExecutorService executor = Executors.newCachedThreadPool(Executors.defaultThreadFactory());
Future<MyResult> future;
Run Code Online (Sandbox Code Playgroud)

然后将您的网络代码包装在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);
Run Code Online (Sandbox Code Playgroud)

如果要取消,可以从任何线程进行此调用:

future.cancel(true);
Run Code Online (Sandbox Code Playgroud)

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

  • 如果HttpURLConnection正在等待读取,则这不起作用.我正在测试它,并且在取消后线程永远不会消失.我已经创建了一个测试,其中目标服务器具有内存不足的情况,它可以接受连接但永远不会返回.以上代码永远无法取消该线程. (5认同)