【问题标题】:Weird behavior with asynctaskasynctask 的奇怪行为
【发布时间】:2014-04-30 05:19:28
【问题描述】:

所以我遇到了一个奇怪的问题,我找不到解释。我有一个异步任务,在它的 doBackground 方法中会等待,直到设置了某个变量,然后通知“等待”

private class TestAsyncTask extends AsyncTask<Void, Object, Boolean> {


        @Override
        protected void onPreExecute() {
              Log.d("Test1");
        }

        @Override
        protected Boolean doInBackground(Void... params) {
               Log.d("Test2");
               while (nextCardToPlay == null) {
        wait();             
       }
               Log.d("Test3");
       }
}

活动 A:

protected void onCreate(){
     a = new TestAsyncTask().execute();
}

protected void onPause(){
    a.cancel()
}

正如您所见,活动启动时,asyncTask 已启动。当活动关闭时,asyncTask 应该被取消。

我注意到,如果我打开活动,关闭它,然后再次重新打开它,则会创建异步任务并处于等待模式(从不取消)。没问题。令人困惑的是,当我开始活动时(虽然存在陈旧的 asyncTask),然后似乎启动了一个新的 asyncTask(因为调用了 OnPreExecute 的日志)但是 nextAsyncTask 中的 doInBackground 没有执行,因为 Test2 日志不是显示。

知道为什么吗?

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

如果您查看documentation,这种行为一点也不奇怪,它表明AsyncTasks 在单个后台线程上运行,即按顺序运行。如果您真的希望您的任务在并行工作线程上运行,请使用executeOnExecutor() 方法而不是简单的execute() 并将AsyncTask.THREAD_POOL_EXECUTOR 参数传递给它。

【讨论】:

  • 你是最棒的。完美的答案。我会试试的。现在我的另一个问题是取消异步任务。当我的活动关闭时,我永远无法确保它被取消
  • 自我顺便说一句,如果我使用你的方法,asynctask 的池会保持在 5 吗?所以 asynctask 可以重用,或者 executeOnExecuter 有缺点
  • @Snake,关于取消,请参阅该文章的取消任务部分,了解如何优化此过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2021-06-08
  • 2015-07-20
相关资源
最近更新 更多