【问题标题】:Android - Proper way of using AsyncTasks?Android - 使用 AsyncTasks 的正确方法?
【发布时间】:2011-10-04 22:02:49
【问题描述】:

使用异步任务的正确方法是什么? 假设用户进入一个活动,异步任务启动,当异步任务运行时,用户决定导航到另一个页面。

  • anynctask 会发生什么?它会一直运行到完成吗?
  • 我是否有责任以某种方式停止此异步任务?

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    异步任务将继续运行。当 Android 操作系统在内存不足时尝试回收内存时,异步任务可能会死掉。如果您不在乎异步任务可能无法完成,那么也许这无关紧要,但这是不好的做法。

    此外,根据您存储/处理结果的方式,当异步任务终止时,您可能会尝试编辑该活动中不再存在的活动/对象,从而导致空指针异常和其他坏事。这样做的正确方法是从您的活动中启动一个服务,然后从该服务中启动一个异步任务。您应该遵循 Google IO 2010 上本次演讲中概述的设计模式之一:

    Android REST Client Design Patterns

    这个话题很有趣,但很难理解,而且没有给出代码,所以这是我用来学习这些东西的一个很好的教程:

    Downloading Data with Services

    此外,android 将为您管理异步任务的线程池(我相信当您的进程中有 5 个以上时它会开始杀死它们),您不必杀死它们。在这里查看答案:

    How AsyncTasks die

    【讨论】:

      【解决方案2】:

      我想快点:

      • 如果不对您的程序造成负面影响,您必须负责停止异步任务。阅读this

      • 你的 asynctask 会通过 onPreExecute()-doInBackground(Params...)-onPostExecute(Result)-End of asynctask life

      • Asynctask 只执行一次,如果你想再执行一次,你必须再创建一个

      【讨论】:

        【解决方案3】:
        1. 是的,如果您在导航到另一个 Activity 时没有停止它,AsyncTask 将继续运行。即使设备的配置发生变化(例如旋转),它也会继续运行。如果你想在 postExecute() 上做一些对 UI 有影响的事情,那么你必须确保你在这个方法中修改的 UI 小部件的引用是有效的,即使在旋转之后,当 Activity 重新创建时也是如此。

        2. 是的,如果您不需要 AsyncTask,您有责任停止(即 .cancel())。但是请注意,处于执行过程中的 AsyncTask 不会仅仅因为您在其上调用了 .cancel() 而停止。它会继续运行,但任务完成时不会调用它的 postExecute() 方法。

        【讨论】:

          猜你喜欢
          • 2023-03-30
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 2011-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多