【问题标题】:AsyncTask doesn't run sometimes despite state being RUNNING?尽管状态为 RUNNING,但 AsyncTask 有时不运行?
【发布时间】:2023-03-21 13:20:01
【问题描述】:

在我的应用程序中,我在 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();

问题发生在我启动 Activity 并在 AsyncTask 完成之前关闭 Activity 时,如果这种情况发生一次,它似乎很好,但在它发生第二次之后,AsyncTask 只会到达 onPreExecute() 方法和在应用程序被强制停止并重新启动之前,永远不会再次完成。

有人知道为什么会这样吗?

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Pentium10,所以我应该在我的活动 onDestroy() 方法中调用 selectrintongtask.cancel(true) 吗?并且在每个 Asynctask 方法中,在方法中执行任何操作之前都对 isCancelled 进行检查?在 shevles surce 代码中是否有任何特定的文件最能突出这一点?再次感谢
    • 查看该文件中的 AddBookActivity.java 和 UserTask(mAddTask) 和 SearchTask。 code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/…
    • 我不知道,但不涉及。看看他们如何计算出 mAddTask 变量的活动周期事件。
    • 好的,我认为您应该使用完整的活动源代码发布另一个问题,并描述您面临的问题。不要忘记提及您正在实施取消。
    • Pentium10 您是否从另一个帐户为您所有的 cmets 投票? ;)
    【解决方案2】:
        if(srtt == null){    <--- Not needed
            srtt = new SelectRingtoneTask();
            Log.d("cda", "RingTone - " + srtt.getStatus());
        }
        srtt.execute();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2019-06-23
      • 2015-08-09
      相关资源
      最近更新 更多