尽管状态为正在运行,AsyncTask有时不会运行?

问题描述:

在我的应用程序中,我使用AsyncTask启动我的Activity以获取特定联系人的铃声。尽管状态为正在运行,AsyncTask有时不会运行?

它工作正常,但我注意到,如果应用程序在AsyncTask到达doInBackground方法之前停止两次,那么当Activity再次启动时,AsyncTask无法正常运行,只能进入onPreExecute()方法。

这里是我的代码:

的的AsyncTask本身:


private class SelectRingtoneTask extends AsyncTask<String, Void, Void> { 

      // can use UI thread here 
      protected void onPreExecute() { 
       Log.d("cda", "Into selectRingToneTask - onPreExecute() - " + selectRingtoneFinished); 
      } 

      // automatically done on worker thread (separate from UI thread) 
      protected Void doInBackground(final String... args) { 
       Log.d("cda", "Into selectRingToneTask - !!!!!!!!!!!!!!!"); 
      getRingTone(); 
      return null; 
      } 

      // can use UI thread here 
      protected void onPostExecute(final Void unused) { 
      selectRingtoneFinished = true; 
      Log.d("cda", "Into selectRingToneTask - onPostExecute - " + selectRingtoneFinished); 
      } 
     } 

当我打电话的AsyncTask在启动时:


if(srtt == null){ 
srtt = new SelectRingtoneTask(); 
Log.d("cda", "RingTone - " + srtt.getStatus()); 
} 
srtt.execute(); 

当我在AsyncTask完成之前启动活动并关闭活动时,会出现问题,如果发生一次,它似乎很好,但在第二次发生AsyncTask后,只会进入onPreExecute()方法,并且永远不会再完成,直到应用程序强制停止并重新启动。

有没有人知道为什么会发生这种情况?

当您的活动被销毁时,您需要cancel这个AsyncTask,并且在AsyncTask的方法中,在尝试使用获取的结果之前检查isCancelled标志。

我强烈建议您阅读Shelves的源代码,以了解如何跨配置更改保留任务以及如何在活动被破坏时正确取消任务。

+0

感谢Pentium10,所以我应该在我的Activities onDestroy()方法中调用selectrintongtask.cancel(true)?在每个Asynctask方法中,在执行方法中的任何事情之前,执行isCancelled检查?在sheeles surce代码中,是否有任何特定的文件可以突出显示此最佳?再次感谢 – 2010-09-10 09:43:24

+0

只是添加我已经实现取消我的onDestroy方法中的任务,它已经导致了一些奇怪的行为,而不是当我第一次结束我的活动,第二次我尝试启动它,我只得到一个空白屏幕 – 2010-09-10 10:09:16

+1

查看该文件中的AddBookActivity.java和UserTask(mAddTask)和SearchTask。 http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/activity/AddBookActivity.java – Pentium10 2010-09-10 10:32:38

if(srtt == null){ <--- Not needed 
     srtt = new SelectRingtoneTask(); 
     Log.d("cda", "RingTone - " + srtt.getStatus()); 
    } 
    srtt.execute(); 

林不知道你通过关闭什么,但我有类似的问题与线程。 在我看来,这里的问题是,当你不允许的时候,你第二次点燃同一个活动任务。在关闭活动时解决问题,取消线程并确保将srtt设置为null。希望这可以帮助