API参考文档说明:
AsyncTasks理想情况下应该用于短操作(最多几秒钟)。
如果doInBackground执行需要30秒,问题在于线程池可能会耗尽线程吗?如果是这个原因,如果我确保我的应用程序永远不会有多个这样长时间运行的doInBackground并发执行,那么它是否会停止成为一个问题?
API参考文档说明:
AsyncTasks理想情况下应该用于短操作(最多几秒钟)。
如果doInBackground执行需要30秒,问题在于线程池可能会耗尽线程吗?如果是这个原因,如果我确保我的应用程序永远不会有多个这样长时间运行的doInBackground并发执行,那么它是否会停止成为一个问题?
AsyncTasks不遵循Activity实例的生命周期。如果你在一个Activity中启动AsyncTask并旋转设备,Activity将被销毁并创建一个新实例。但是AsyncTask将不会死亡,直到它完成。
当它完成后,AsyncTask不会更新新Activity的UI。它实际上更新了以前没有显示的Activity的实例。如果您使用findViewById来检索Activity中的视图,则可能导致java.lang.IllegalArgumentException: View not attached to window manager类型的异常。
使用AsyncTasks进行长时间运行的操作是一个非常糟糕的想法。然而,它们适用于短暂的操作,例如在1或2秒后更新视图。
我鼓励您下载RoboSpice Motivations应用程序,它真正深入地解释了这一点,并提供了不同方式执行后台操作的示例和演示。
如果您正在寻找RoboSpice的替代方案,用于非网络相关任务(例如没有缓存),您也可以看看Tape。
对于较长时间运行的任务,特别是只有一个或几个任务,您可能需要使用Service,因为这些可以保持持久性,即使您的应用程序UI关闭以节省内存。
免责声明:我已经有一段时间没有进行Android编码了,因此这个答案可能已经过时或基于错误的理解。如果有更多最近经验的人可以评论确认,我将删除此警告;如果高声望的人知道这是正确的,他们也可以编辑掉这段话。
AsyncTask?
您必须调用AsyncTask.cancel
才能停止它。在启动AsyncTask
的第二个活动中,您可以使用AsyncTask.onCancelled
来释放资源。 - Finding Nemo 2 is happening.