【问题标题】:AsyncTask doesn't receive cancelAsyncTask 没有收到取消
【发布时间】:2014-03-23 06:02:48
【问题描述】:

我的AsyncTask 遇到了一点问题。 我以这种方式运行异步任务:

myTask = new myTask();

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String s) {
                    // same as onquerychange
                    return true;
                }

                @Override
                public boolean onQueryTextChange(String s) {
                    if (!s.isEmpty()) {
                        if (myTask.getStatus() == AsyncTask.Status.RUNNING ||
                                myTask.getStatus() == AsyncTask.Status.PENDING) {
                            myTask.cancel(true);
                        }
                        myTask.execute(context, s);
                    } else {
                        myTask.execute(context, "emptyquery");
                    }
                    return true;
                }
            });

输入第二个字母后,我不断收到:java.lang.IllegalStateException:无法执行任务:任务已经执行(一个任务只能执行一次)

所以我认为它不会被取消。有什么建议?谢谢

【问题讨论】:

  • 您正在多次调用 asynctask
  • 不需要取消线程
  • 我看到了,但我正在调用 myTask.cancel!

标签: android android-asynctask illegalstateexception


【解决方案1】:

当您调用myTask.cancel(); 时,AsyncTask 会尝试停止线程。要强制执行此操作,您可以通过以下方式检查任务是否已取消:

if(isCancelled()){
   return null;
}

doInBackground 内并自行屏蔽。否则在调用onPostExecute 之前已经检查了AsyncTask 的状态。这样,如果您调用cancel(),您可以确定不会返回任何值。在此处查看文档:AsyncTask

无论如何:AsyncTask 只能执行一次。如果必须再次运行它,则必须实例化另一个 AsyncTask。

【讨论】:

    【解决方案2】:

    您不能多次执行相同的AsyncTask。您必须在每次执行之前实例化它,例如:

    myTask = new myTask();
    myTask.execute(context, s);
    

    当然你也可以去掉开头的初始化。

    要停止和重新启动,请使用:

    myTaks.cancel(true);
    myTask = new myTask();
    myTask.execute(context, s);
    

    即使您取消了AsyncTask,您也无法再次使用它。

    【讨论】:

    • 是的,我知道,但我只想执行一次任务......所以如果我在搜索栏中快速输入:a - b - c - d 我将有 4 个正在运行的任务。 ..我只想要最后一个搜索查询中的一个!可能吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多