异步任务无法执行:该任务已经被执行。

3

我知道之前的AsyncTask正在运行-我的问题是如何结束它并重新执行,因为我的参数已经更改。

    protected class ImageDownloadTask extends AsyncTask<Response, Void, Void>{

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                poolTasks.add(this);
            }

            @Override
            protected Void doInBackground(Response... params) {
                int count=params[0].getGetPosts().getPostsCount();
                for(int i = 0; i < count; i++){
                    Post post = params[0].getGetPosts().getPosts(i);

                    if(!isCancelled()){
                        try {

//some code to download images
} catch (Exception e) {


                        }
                        publishProgress();
                    } else poolTasks.remove(this);
                }
                return null;
            }

            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
                adapter.notifyDataSetChanged();
            }

            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                poolTasks.remove(this);
                adapter.notifyDataSetChanged();
            }

            @Override
            protected void onCancelled() {
                super.onCancelled();
                poolTasks.remove(this);
            }
        }

现在,关于参数更新,这就是我所说的任务:

     Log.d("MyLog"," imageTask.getStatus()="+imageTask.getStatus());
     if (imageTask.getStatus() == AsyncTask.Status.RUNNING){
         imageTask.cancel(true);
     }
     imageTask.execute(response);

首先,根据日志显示的状态为 FINISHED,那么它怎么可能在运行呢?如何正确地重新启动这个 AsyncTask?

1个回答

0

从个人经验来看,AsyncTask实例只适用于一次执行。它不可重复使用。为了您的目的,您应该重新初始化它,然后执行。

希望我能帮到您。

有关参考,请查找标题“线程规则”这里


我在静态方法中使用它,所以我需要将其作为静态对象。我不能只使用“new ImageTask.execute(response);” - 我需要先声明它为静态的。 - Vlad Alexeev
你不能像下面这样使用变量吗?static ImageTask newInstance = new ImageTask( /* 参数 */ ); newInstance.execute( /* 参数 */ );或者ParentClass.staticInstance = new ImageTask( /* 参数 */ ); ParentClass.staticInstance.execute ( /* 参数 */ );请分享声明代码,这样我可以更好地理解。 - SlashG
我这样使用它 - 在声明中是protected static ImageDownloadTask imageTask;,在onCreate()中是imageTask = new ImageDownloadTask(); - Vlad Alexeev
从我的有限理解来看,您可以在声明范围内创建一个函数来重新初始化“imageTask”。否则,我建议您要么使其在范围内可访问和可修改,要么使用本地声明的实例。 “AsyncTask”不可重用,伙计。 :) - SlashG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接