如何检查asynchronous任务是否已经在运行

我有一个应用程序需要做一个密集的数据库操作启动。 该应用程序保存手机上的联系人的本地副本,并在启动时与Android联系人数据库同步。

如果用户启动该应用程序,则会启动一个asynchronous任务,使数据库在后台同步。 如果用户closures应用程序,操作继续运行,这是很好的。 但是,如果用户再次打开该应用程序,asynchronous任务将启动并产生错误。

有无论如何检查任务是否已经从应用程序的另一个实例运行?

Solutions Collecting From Web of "如何检查asynchronous任务是否已经在运行"

我想你应该检查AndroidApplication的概念。 http://developer.android.com/reference/android/app/Application.html

其实没有这样的事情

应用程序的不同实例

。 所有Activities/Services.Application总是相同的Activities/Services. 这意味着你离开了Activity并再次打开,有两种情况是可能的:

  1. 系统已经杀死你的应用程序。 在这种情况下, AsyncTask已经死了,开始一个新的是安全的
  2. Application仍然活着,所以AsyncTask可能仍在运行。

在第二种情况下,我会build议使用一些静态variables,指向这个AsyncTask或它的状态。 如果您的应用程序在第二次打开时仍处于活动状态 – 所有静态引用将仍然有效,因此您可以成功操作。

PS:顺便说一下,在目前的方法中,请注意,您的应用程序可以在任何时候被系统终止。 所以AsyncTask可以随时中断。 它不适合你 – 请检查IntentServices – 专为背景操作而devise的组件。 http://developer.android.com/reference/android/app/IntentService.html

祝你好运!

使用getStatus()来获取你的AsyncTask的状态。 如果状态是AsyncTask.Status.RUNNING那么你的任务正在运行。

编辑:你应该重新考虑你的实现,并保持AsyncTask可能在ServiceIntentService从Web获取您的数据。

是的,这些都是一些例子。

 LoadMusicInBackground lmib = new LoadMusicInBackground(); if(lmib.getStatus() == AsyncTask.Status.PENDING){ // My AsyncTask has not started yet } if(lmib.getStatus() == AsyncTask.Status.RUNNING){ // My AsyncTask is currently doing work in doInBackground() } if(lmib.getStatus() == AsyncTask.Status.FINISHED){ // My AsyncTask is done and onPostExecute was called } 

我设法用某种单例模式来解决这个问题。 希望能帮助到你。

 // fill the places database from a JSON object public class myAsyncTask extends AsyncTask<Void,Integer,Integer> { Activity mContext = null; static AsyncTask<Void,Integer,Integer> myAsyncTaskInstance = null; // Private Constructor: can't be called from outside this class private myAsyncTask(Activity iContext) { mContext = iContext; } public static AsyncTask<Void, Integer, Integer> getInstance(Activity iContext) { // if the current async task is already running, return null: no new async task // shall be created if an instance is already running if ((myAsyncTaskInstance != null) && myAsyncTaskInstance.getStatus() == Status.RUNNING) { // it can be running but cancelled, in that case, return a new instance if (myAsyncTaskInstance.isCancelled()) { myAsyncTaskInstance = new myAsyncTask(iContext); } else { // display a toast to say "try later" Toast.makeText(iContext, "A task is already running, try later", Toast.LENGTH_SHORT).show(); return null; } } //if the current async task is pending, it can be executed return this instance if ((myAsyncTaskInstance != null) && myAsyncTaskInstance.getStatus() == Status.PENDING) { return myAsyncTaskInstance; } //if the current async task is finished, it can't be executed another time, so return a new instance if ((myAsyncTaskInstance != null) && myAsyncTaskInstance.getStatus() == Status.FINISHED) { myAsyncTaskInstance = new myAsyncTask(iContext); } // if the current async task is null, create a new instance if (myAsyncTaskInstance == null) { myAsyncTaskInstance = new myAsyncTask(iContext); } // return the current instance return myAsyncTaskInstance; } @Override protected Integer doInBackground(Void... iUnUsed) { // ... } }