从Activity或IntentService启动的AsyncSync之间有什么区别吗?
我正在构建一个通过http下载和上传文件的应用。我为每次转移使用自定义通知布局和进度条。 我选择并行转移或将它们放入队列(你会建议哪个选项?)。
对于带队列的选项,我使用IntentService,因此Android框架负责将任务放入队列中。 为了让它们并行使用,我使用AsyncTasks。但是我从IntentService中解雇了它们(也可能是服务) - 有什么意义吗? IntentService在执行AsyncTask后立即终止,因此AsyncTask在没有任何“父”的情况下运行。
如果我从Activity中激活了那些AsyncTask,请转到主屏幕,系统决定关闭此活动?它能做到吗? AsyncTask能否存活下来?
这种情况的首选方法是什么?
答案 0 :(得分:1)
AsyncTask不适用于您担心在组件生命周期之外存活的事情(如果您需要向该组件发送消息)。如果你要服务的程度,我甚至不会打扰AsyncTasks。就并行或队列而言,这实际上取决于许多不同的变量,但我当然不会让任何数量的下载/上传完全并行。我对最大并发传输数设置了一些限制。
使用IntentService进行并行执行毫无意义 - 您已经注意到了这个问题。您正在进入Android API未涵盖的领域。 AsyncTask和IntentService是很好的抽象,可以使几个场景变得简单,但许多任务的并行执行不是其中之一。最好使用一些Java线程/并发类。看看ThreadPoolExecutor。
答案 1 :(得分:0)
首先你的简单问题是,只要父应用程序没有被杀死,AsyncTask就会在后台生存。从Activity开始它将告诉系统如果内存压力需要它可以被杀死。系统也不认为它有一个可能被中断的长时间运行过程。
开发指南Services在“基础知识”标题下有一个很好的信息框,关于您是否应该使用服务或活动。当系统资源再次可用时,活动不会考虑服务获取或重启后重启的内存压力。
如果您希望我为您拨打电话,请使用IntentService。无论是并行或串行还是某种组合运行下载都是一项艰难的要求,因为您必须考虑网络(Wifi或Cellular),文件大小和其他系统资源。