Android 异步任务超过几秒钟?

Android 异步任务超过几秒钟?,android,android-asynctask,Android,Android Asynctask,API参考说明: AsyncTasks最好用于短期操作(几秒钟 顶多。) doInBackground的问题是线程池可能会在30秒后耗尽线程吗?如果这就是原因,那么如果我确保我的应用程序永远不会有超过一个这样长时间运行的doInBackground同时执行,这是否就不再是一个问题了 我认为AyncTasks通常仍然绑定到生成它们的前台活动堆栈,因此,例如,如果某个活动生成异步任务,用户离开应用程序,然后操作系统内存不足,它将终止该活动的进程(包括仍在运行的异步任务),如果用户恢复/返回到你的应用

API参考说明:

AsyncTasks最好用于短期操作(几秒钟 顶多。)


doInBackground的问题是线程池可能会在30秒后耗尽线程吗?如果这就是原因,那么如果我确保我的应用程序永远不会有超过一个这样长时间运行的doInBackground同时执行,这是否就不再是一个问题了

我认为AyncTasks通常仍然绑定到生成它们的前台活动堆栈,因此,例如,如果某个活动生成异步任务,用户离开应用程序,然后操作系统内存不足,它将终止该活动的进程(包括仍在运行的异步任务),如果用户恢复/返回到你的应用程序,你只需要恢复状态并重新开始

对于运行时间较长的任务,尤其是只有一个或几个任务的任务,您可能需要一个服务,因为即使在关闭应用程序的UI以节省内存时,这些任务也可以持久存在


免责声明:我已经有一段时间没有做过Android编码了,所以这个答案可能已经过时了,或者基于对事物如何工作的错误理解。我将删除此警告,如果有人与最近的经验可以评论确认;如果高级代表知道这是正确的,欢迎他们直接编辑掉这一段。

Walter Mundt给出的答案是正确的。尽管如此,我还是想补充一些信息,并给出一个指向可用于长时间运行异步任务的库的指针

异步任务是为在后台完成任务而设计的。是的,如果您的任务持续两段时间,那么您将面临两个不同的问题:

  • 活动与活动生命周期的关系很差,如果活动终止,您将无法获得任务的结果。的确,是的,你可以,但这将是一条艰难的道路
  • 异步任务没有很好的文档记录。简单但直观的asynctask实现和使用会很快导致内存泄漏
  • ,我想介绍的库,由@Walter Mundt提出,使用后台服务来执行此类请求。它是为网络请求而设计的(本质上可能是长时间运行的),但它可以很容易地适应于只执行与网络无关的长时间运行的任务。我很乐意为它添加一个补丁

    以下是异步任务不适合长时间运行任务的原因。下面的理由是对Experpts的改编:该应用解释了为什么使用RoboSpice可以满足Android平台的需求

    异步任务和活动生命周期 异步任务不遵循活动实例的生命周期。如果在活动内启动异步任务并旋转设备,则该活动将被销毁并创建新实例。但这项任务不会消亡。它将继续生存,直到它完成。

    当它完成时,AsyncTask不会更新新活动的UI。实际上,它更新了活动的前一个实例 不再显示。这可能导致java.lang.IllegalArgumentException类型的异常:如果 例如,使用findViewById检索活动内部的视图。

    内存泄漏问题 将异步任务创建为活动的内部类非常方便。因为AsyncTask将需要操纵视图 当任务完成或正在进行时,使用活动的内部类似乎很方便:内部类可以 直接访问外部类的任何字段。

    然而,这意味着内部类将在其外部类实例上持有一个不可见的引用:活动。

    从长远来看,这会产生内存泄漏:如果AsyncTask持续很长时间,它会使活动保持“活动状态” 而安卓希望摆脱它,因为它不能再显示了。活动不能被垃圾收集,这是一个中心问题 Android在设备上保留资源的机制。

    您的任务进度将丢失 您可以使用一些变通方法来创建长时间运行的异步任务,并根据活动的生命周期管理其生命周期。您可以选择,也可以让异步任务完成,而不影响其进度和性能

    这是可能的,我们展示了如何在RobopSpice中实现,但它变得复杂,代码也不是真正的通用代码。此外,如果用户离开活动并返回,您仍然会失去任务的进度。加载程序也会出现同样的问题,尽管它与上面提到的重新链接解决方法的AsyncTask相比更简单

    使用Android服务 最好的选择是使用服务来执行长时间运行的后台任务。这正是机器人世界提出的解决方案。同样,它是为网络设计的,但也可以扩展到与网络无关的东西。这个图书馆有一个图书馆

    你甚至可以在不到30秒的时间内得到一个想法,多亏了一个


    在长时间运行的操作中使用AsyncTasks确实是一个非常糟糕的主意。尽管如此,对于短时间的视图(例如在1或2秒钟后更新视图)来说,它们还是可以的

    我鼓励您下载,它真正深入地解释了这一点,并提供了执行一些后台操作的不同方法的示例和演示



    如果您正在为非网络相关任务(例如,没有缓存)寻找RoboSpice的替代方案,您也可以看看。

    我可以问一下您想做什么吗?我有一个屏幕,屏幕上有一组指向远程音频样本的链接,当用户单击相关音频样本应该播放的链接时,播放时间约为30秒。当示例结束时,或者如果用户单击其他链接,或者由于其他一些原因,播放将停止。我想在Asy做所有MediaPlayer的事情