我在我的android应用程序中使用AsyncTask
进行短操作任务,现在我想为Long-Running任务实现相同的功能 - 是否有相同的接口具有相同的库?
BTW请不要建议Service
,因为我想在任务完成后更新我的UI!
任何建议都将不胜感激!
答案 0 :(得分:2)
现在我想为Long-Running任务实现相同的功能
这取决于“长期任务”的性质。
如果它的持续时间不到一秒(通常),请坚持使用AsyncTask
。
如果它超过一秒但少于15秒,请使用IntentService
。
如果它超过15秒,但会在更长的秒数后自行结束,请使用我的WakefulIntentService
或WakefulBroadcastReceiver
和IntentService
。这些是在工作进行时帮助保持设备清醒的必要条件。
如果只有当用户表明它应该结束时才会结束(例如,通过按下用户界面中的某个“停止”按钮),请使用由常规Thread
管理的Service
1}},如果需要,也许还要小心使用你自己的WakeLock
。
是否有相同的库具有相同的界面?
要求我们推荐或找到工具,库或最喜欢的场外资源的问题是Stack Overflow的主题,因为它们往往会吸引固执己见的答案和垃圾邮件。
BTW请不要建议服务
如果任务运行的时间足够长,AsyncTask
不合适,那么根据定义,Service
是必不可少的。
因为我想在任务完成后更新我的UI!
当长时间运行的任务完成时,没有什么能阻止您更新UI。使用活动巴士(LocalBroadcastManager
,Square's Otto,greenrobot的EventBus)。或者,使用Messenger
。
请记住,任何“长时间运行的任务”,当“任务完成”时,您的UI可能不再存在。
答案 1 :(得分:2)
我通常使用Service
在任务完成后通知用户界面。
在UI线程上运行Service时,仍需要在AsyncTask上完成长时间运行任务的实际工作。系统终止任务的可能性比在Activity上工作的几率要低。
我是通过在服务连接后使用活页夹设置Activity的回调来实现的。
有关将Activity绑定到服务的详细信息,请参阅http://developer.android.com/guide/components/bound-services.html。
仅当您的服务和活动位于同一进程时,此方法才有效。 (这是默认设置)
答案 2 :(得分:0)
有几种选择:
1)您也可以将AsynkTask
用于长时间运行的任务。
如果您希望一次运行多个任务,可以使用AsyncTask的executeOnExecutor(...)
方法和THREAD_POOL_EXECUTOR
作为第一个参数
2)Service
(IntentService
用于异步)。
要更新用户界面,您可以使用Intent
& BroadcastReceiver
个班级。
示例:
在您的活动中注册一个BroadcastReceiver
,让您的任务完成回调
在您希望开始执行长任务的活动中,只需致电startService()
,然后通过Intent
向IntentService
提供IntentService
行动&已经设置了附加功能。
在onHandleIntent()
sendBroadcast()
中,您可以检查操作,传入意图的额外内容并启动您想要的任务。
任务完成后,您只需使用Intent
拨打BroadcastReceiver
即可在您的活动中触发{{1}}
就是这样。如果这很困难,你应该看看Intents,BroadcastReceivers&服务工作