异步任务在安卓上没有取消长时间运行的操作。

4
我需要从服务器下载大量数据,最少需要10秒。以下是我使用AsyncTask类进行下载的代码。当用户在下载操作进行时点击主页按钮,我想无条件取消下载操作。问题是…我执行cancel()方法,但它并没有取消下载操作。我发现在logcat视图中仍在运行操作,即使我退出了应用程序。我只想停止执行doInBackground()方法。请指导/帮助我。
点击下载按钮:
  dwnldTask = new DownloadTask ();
  dwnldTask.execute(SERVER_URL);

这里是Asynctask类:

 class DownloadTask extends AsyncTask<String, Void, Object>{
    private Object response = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

         displaying progress dialog on UI 
    }
    @Override
    protected Object doInBackground(String... params) {
        try{   

             DataConnection dc = new DataConnection();

             this.response = dc.connectToServer(params[0]);

            if(isCancelled()){
                return null;
            }


        }catch (Exception e) {
            if(isCancelled()){
                return null;
            }   
            e.printStackTrace();
            showToastMSG(e.getMessage());
        }  

        return this.response ;
    }

    @Override
    protected void onPostExecute(Object response) {
        super.onPostExecute(response);

        if(response != null ){ 
            successfully downloaded...  go to next activity
             } 
            cancel progress dialog here
    }

} 

在onPause()方法中...
  @Override
protected void onPause() {
    super.onPause();
    if(dwnldTask != null && dwnldTask.getStatus() == AsyncTask.Status.RUNNING){
        dwnldTask.cancel(true);
    }  
     cancel the progress dialog if it is showing

}

这里是另一个名为DataConnection的类中的方法...

  public Object connectToServer(String url) throws Exception{
    HttpGet request = new HttpGet(url);
    request.addHeader("accept","application/json");
    HttpResponse response = httpClient.execute(request);   
    HttpEntity httpEntity = response.getEntity();
    InputStream responseInputStream = httpEntity.getContent();
    return myUtilObject.convertInputStreamToString(responseInputStream);
}

在进行网络调用时,如果出现中断,您将会收到一个中断异常。 - njzk2
当按下主页按钮时,onStop()方法不会被调用。 - SKT
你确定你将 dwnldTask 设置为任务对象了吗?你确定你调用了 onStop() 吗? - andr
2个回答

3
您在下载后检查isCancelled()方法,因此没有理由它会在中途被取消。通常您需要像这样做:
while (!isCancelled()) {
 // Download next buffer..
}

在这种情况下,一旦收到取消请求,循环将停止。

有一个原因 - 他调用了 cancel(true),其中 true 表示IO操作应该被中断,并抛出 InterruptedException 异常。 - andr
@Ran:我有一个单独的类,其中包含连接服务器并从服务器读取数据的方法。因此,我正在为该类创建一个对象,并调用doInBackground()中的方法进行下载。如何在该类中检查操作是否已取消? - Santhosh

3
我同意Ran的观点 - 你没有编写以下代码: myUtilObject.convertInputStreamToString 但我猜测你在那里使用了一个预定义大小的缓冲区(可能是用BufferedReader?)循环读取输入流 - 在这个循环中,你应该检查异步线程的停止条件 - isCancelled() 是一个很好的例子。
如果线程被取消,循环应该停止,即:
String line = "";
StringBuilder total = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is), 1024);
while ((line = rd.readLine()) != null && !isCancelled())
{
     total.append(line);
}

已解决。感谢你们两位。 - Santhosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接