早安全,
我有一个从互联网下载图片的异步任务。我有三个带有名字的按钮,如果按下的名称与已经下载的名称不同,我希望它取消任务并以新名称开始。
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之后。
有人对此有什么看法吗?
答案 0 :(得分:1)
AsyncTask的cancel()
方法不会中断您的doInBackground()
方法,只会在您onCancelled()
方法后调用onPostExecute()
而不是doInBackground()
回报。如果您希望取消doInBackground()
的执行,则需要定期在isCancelled()
方法中调用doInBackground()
,并在检测到取消状态时提前返回。
有关详细信息,请参阅cancel()
方法的docs。