0

在我的应用程序中,我在 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 完成之前启动活动并关闭 Activity 时,如果这种情况发生一次,它似乎很好,但在第二次发生后,AsyncTask 只会进入 onPreExecute() 方法并且永远不会完成再次,直到应用程序被强制停止并重新启动。

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

4

2 回答 2

2

当您的 Activity 被销毁时,您需要cancel使用 AsyncTask,并在 AsyncTask 的方法中检查isCancelled标志,然后再尝试使用获取的结果。

我强烈建议阅读Shelves的源代码,了解如何跨配置更改持久化任务以及如何在活动被销毁时正确取消它们。

于 2010-09-10T09:20:56.870 回答
0
    if(srtt == null){    <--- Not needed
        srtt = new SelectRingtoneTask();
        Log.d("cda", "RingTone - " + srtt.getStatus());
    }
    srtt.execute();

我不确定你的意思是什么,但我对线程有类似的问题。在我看来,这里的问题是,当您不允许这样做时,您会第二次触发相同的活动任务。要在关闭活动时解决问题,请取消线程并确保将 srtt 设置为 null。希望这可以帮助

于 2011-05-27T15:21:00.520 回答