Android:Async任务返回null,即使在工作时也是如此

时间:2013-04-22 10:18:15

标签: android android-asynctask

早安全,

我有一个从互联网下载图片的异步任务。我有三个带有名字的按钮,如果按下的名称与已经下载的名称不同,我希望它取消任务并以新名称开始。

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之后。

有人对此有什么看法吗?

1 个答案:

答案 0 :(得分:1)

AsyncTask的cancel()方法不会中断您的doInBackground()方法,只会在您onCancelled()方法后调用onPostExecute()而不是doInBackground()回报。如果您希望取消doInBackground()的执行,则需要定期在isCancelled()方法中调用doInBackground(),并在检测到取消状态时提前返回。

有关详细信息,请参阅cancel()方法的docs