【问题标题】:AsyncTask of 'Activity A' doesn't execute if I re-open 'Activity A' before the original AsyncTask has finished executing如果我在原始 AsyncTask 完成执行之前重新打开“Activity A”,则“Activity A”的 AsyncTask 不会执行
【发布时间】:2016-04-21 22:22:53
【问题描述】:

我有一个 AsyncTask 实现如下:

   AsyncTask asyncTask = new AsyncTask() {
                @Override
                protected Object doInBackground(Object[] params) {
                     //downloading images from google places api
                }

                @Override
                protected void onPostExecute(Object o) {

                    }
                }
            };
            asyncTask.execute(); 

此 AsyncTask 被触发多次运行,并由另一个 AsyncTask 的 doInBackground() 方法的范围执行。它运行良好第一次我加载一个活动,如果我让所有数据下载然后退出活动(以便调用 onStop())并重新打开活动它也运行良好,然后, 但是,如果我在下载所有数据之前退出活动,当我重新打开活动时它不会运行。

有人知道这是为什么吗?谁能推荐一种不涉及 AsynTask 的更好方法?

注意:我曾尝试使用 executeOnExecutor(),但并没有解决问题。

提前致谢

【问题讨论】:

  • 您以哪种方式开始任务?另外,你是如何离开和重新进入活动的?
  • 我在另一个任务的 doInBackground() 方法中调用的方法中启动任务。我离开并重新进入活动的原因是模拟用户在应用程序中迭代不同的屏幕
  • 第一个任务是用什么方法启动的?
  • 顺序是这样的:getLocation >queryMapsApiTask > getMainJSONObjectTask>methodToExtractJSONData>getPicturesTask,其中最后一个方法(getPicturesTask)是没有执行的任务
  • 在任务中使用任务似乎不是一个好主意。无论如何,看看这个 - stackoverflow.com/questions/10048958/…

标签: java android multithreading android-asynctask


【解决方案1】:

AsyncTasks 按接收顺序在单个线程上运行。如果您在 AsyncTask 完成之前退出,它会继续运行。如果在它完成之前重新启动它,它会在任务队列中等待,直到原始运行完成后才能运行。您可以通过告诉它在自己的队列上运行来避免它。虽然更好的方法可能是加载器,如果它无论如何都会获取相同的数据(这将允许它不运行第二次,而是使用第一次运行的结果)。

【讨论】:

  • 感谢您的回复,并为我的延迟回复感到抱歉。加载程序建议不适合我的情况,因为每次创建活动时我都在寻找新数据。问题是,通过正在启动的 Activity 触发的未决 AsyncTask 不会在任务队列中等待,直到原始 AsyncTask 完成,或者至少似乎没有完成,因为无论 Activity 离开多长时间,它们都不会执行。如果通过在自己的队列上运行您的意思是使用一个版本的 executeOnExecutor(),我已经尝试过,但它没有用。这就是你的建议吗?
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多