Android:异步任务返回空值,即使在工作时也是如此

标签 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。

有人对此有想法吗?

最佳答案

AsyncTask 的 cancel() 方法不会中断您的 doInBackground() 方法,它只会导致 onCancelled() 被调用而不是 onPostExecute() 一旦你的 doInBackground() 方法返回。如果您希望能够取消 doInBackground() 的执行,您需要在 doInBackground() 中定期调用 isCancelled()方法并在检测到取消状态时提前返回。

参见 docscancel() 方法上获取更多信息。

关于Android:异步任务返回空值,即使在工作时也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16144653/

相关文章:

android - 如何使用列表中的异步任务从android中的房间表获取所有数据

android - 将 AudioTrack 与 JLayer 解码器一起使用

android - 在 AsyncTask 中传递超过 1 个不同类型的变量

java - 为什么我得到 "mergeCursor"对象而不是 "string"?

android - Gradle 在编译时将文件从资源复制到 Assets

安卓 : Which method is called when fragment is pop out from backstack

android - 带有textview参数的AsyncTask

Android:通过 http 加载多个位图/缩略图的最快方法是什么?

android - 围绕屏幕中心旋转 Canvas ,同时允许翻译

java - 无法在 AsyncTask 中获取经纬度