如何停止执行HttpConnection.getInputStream()?

时间:2014-02-03 16:59:34

标签: android android-asynctask urlconnection httpsurlconnection

问题

我正在HttpsUrlConnection.getInputStream()内运行AsyncTask.doInBackground()内的DialogFragment方法。

我希望它在用户退出片段时终止。

如果不这样做,无用的数据将继续在后台加载。

我尝试了什么

我尝试在URLConnection回调中将null对象设置为onDismiss(),但它并不会阻止getInputStream()方法执行。 我不能在UI线程中调用mConnection.disconnect(),并且它在另一个AsyncTask中无效,因为它们是按顺序执行的。

AsyncTask.cancel()无用,因为它不会停止doInBackground()方法。

问题

如何强制从getInputStream()方法返回?


代码

根据@CarlosRobles请求,这是我的doInBackground()的代码

    URL url = new URL(urlString);
    setCurrentConnection((HttpsURLConnection) url.openConnection());
    mCurrentConnection.setSSLSocketFactory(mSSLSocketFactory);
    mCurrentConnection.connect();

    int responseCode = mCurrentConnection.getResponseCode();
    if (responseCode >= 400) {
        throw new IOException("Bad response code");
    }
    Log.d(TAG, "response code: " + responseCode);

    // TODO: Should call .close() if IOException happens here?
    InputStream inputStream = mCurrentConnection.getInputStream();

    String response = convertStreamToString(inputStream);

    inputStream.close();
    mCurrentConnection.disconnect();

    return response;

其他注意事项

我刚刚检查了上面代码段中调用的所有函数的执行时间,我发现UrlConnection.getResponseCode()是迄今为止运行时间最多的函数。我想这是因为它内部有UrlConnection.getInputStream()的调用。之后,inputStream总是缓存到连接对象中,这就是UrlConnection.getInputstream()在我的函数中几乎没有时间的原因。

1 个答案:

答案 0 :(得分:0)

在用户界面中,您可以调用AsyncTask.cancel(true);,在doInBackground()中,您可以继续调用isCancelled()来检测函数是否必须中止,之后您可以执行任何操作

我们可以阅读here

  

取消任务可以随时通过调用取消任务   取消(布尔值)。调用此方法将导致后续调用   isCancelled()返回true。 [...]确保完成任务   尽快取消,你应该经常检查退货   ifCancelled()的值定期来自doInBackground(Object []),if   可能的(例如在循环内)。

在您的doInBackground中,您拥有convertStreamToString函数功能。这是最长的操作,在其内部肯定可以中断下载。对于它内部你有任何类型的循环来检索流的内容并将其保存为字符串,并且你可以在哪里中止它。

 private void convertStreamToString () {    


            //..


           //loop to convert StreamToString
           {
               //..

              // Escape early if cancel() is called
             if (isCancelled()) {
                 mConnection.disconnect()
                 break;
             }
           }

   }