大家早上好
我有一个从互联网下载图片的异步任务。我有三个带有名称的按钮,如果按下的名称与已经下载的名称不同,我希望它取消任务并以新名称开始一个。
DownloadImageTask downloadPicTask = null;
int tasksRunning;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.detail, container, false);
fillData();
return rootView;
}
public void fillData(){
if(downloadPicTask != null){
Log.i(TAG,"Trying to cancel task...");
downloadPicTask.cancel(true);
}else{
Log.i(TAG,"why why why");
}
...
downloadPicTask = new DownloadImageTask(imageView);
downloadPicTask.execute(firstName,lastName);
tasksRunning = tasksRunning + 1;
Log.i(tag,String.valueOf(tasksRunning));
...
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
boolean canceled = false;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
@Override
protected void onCancelled() {
Log.i(TAG, "Async Cancelled");
canceled = true;
}
protected Bitmap doInBackground(String... params) {
... //downloading the bitmap here
}
protected void onPostExecute(Bitmap result) {
if(!canceled){
bmImage.setImageBitmap(result);
}
}
}
出于某种原因,一旦第一个任务开始并且我按了不同的名称,downloadPicTask 将返回 null,因此它不会取消。 这只会在第一次取消尝试时发生!即使任务返回 null,它也会正常运行,并在完成时设置 imageview。随后尝试取消任务成功,因为在第一次 downloadPicTask 之后不再返回 null。
有人对此有想法吗?
最佳答案
AsyncTask 的 cancel()
方法不会中断您的 doInBackground()
方法,它只会导致 onCancelled()
被调用而不是 onPostExecute()
一旦你的 doInBackground()
方法返回。如果您希望能够取消 doInBackground()
的执行,您需要在 doInBackground()
中定期调用 isCancelled()
方法并在检测到取消状态时提前返回。
参见 docs在 cancel()
方法上获取更多信息。
关于Android:异步任务返回空值,即使在工作时也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16144653/