gpt4 book ai didi

android - AsyncTask 没有取消 android 中长时间运行的操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:46 25 4
gpt4 key购买 nike

我必须从服务器下载大量数据。下载至少需要 10 秒。这是我使用 asyntask 类下载的代码。如果用户在下载操作正在进行时单击主页按钮,我想无条件地取消下载操作。问题是...我正在执行 cancel() 方法,但它没有取消下载操作。即使我退出应用程序,我也看到该操作正在 logcat View 的后台运行。我只想停止执行 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);
}

最佳答案

我同意 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);
}

关于android - AsyncTask 没有取消 android 中长时间运行的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14724640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com