1

みんなおはよう、

インターネットから画像をダウンロードする非同期タスクがあります。名前の付いた 3 つのボタンがあり、既にダウンロードしている名前とは異なる名前が押された場合は、タスクをキャンセルして新しい名前で開始したいと考えています。

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 を返す場合でも、正常に実行され、終了時にイメージビューが設定されます。最初の downloadPicTask が null を返さなくなった後は、その後のタスクのキャンセルは成功します。

誰でもこれについて考えていますか?

4

1 に答える 1