对于那些经验丰富的网络请求处理人员,我的问题是:是否有更适合或更清晰的实现方法?
据我所知,使用IntentService的优点是它在后台运行而不是在主线程上运行,并且通常是Android操作系统终止的最后一件事。缺点是IntentServices按顺序运行。
我已经阅读了很多关于RxJava和Retrofit的文章,感觉我们的需求可以通过这种组合更好地满足。Retrofit本身可能已经足够了,但我真的很希望得到一些第三方的见解。
我的经验法则是:
如果网络I/O时间应该在一秒内,并且不介意它是否能完成,任何异步选项都可以。
如果网络I/O时间应该超过一秒,或者您真的想增加它能够顺利运行的机会,使用Service
。无论您使用IntentService
还是其他Service
实现,都取决于您,但是您需要拥有一个Service
作为操作系统的指示器,告诉它您正在工作,这样一旦您的应用程序移至后台,它就不会那么快地终止您的进程。请记住,“移至后台”并不总是由用户直接发起的,因为来电等也会将您移至后台。
如果网络I/O需要超过15秒,不仅需要使用Service
,还需要考虑WakeLock
(通过我的WakefulIntentService
、WakefulBroadcastReceiver
或您自己精心管理的WakeLock
)和可能需要WifiLock
。15秒是设置中最短的自动屏幕关闭时长,这就是该数字的来源。
有了这些想法:
缺点是IntentServices按顺序运行。
我的翻译是“IntentService
有一个处理请求的单个线程”。这是正确的。在需要Service
且需要并行处理的情况下,请创建自己的Service
。只要确保没有未完成的工作,就调用stopSelf()
。
我一直在阅读关于RxJava和Retrofit的文章,并认为我们可以更好地满足需求。
这与您是否使用 Service
无关。只要不要尝试从 IntentService
中进行异步操作(例如,使用 Callback
的 Retrofit 调用),因为这会打败 IntentService
的目的(向操作系统指示您正在执行工作)。因此,从 IntentService
中,您将使用 Retrofit 的同步 API,不带 Callback
。
AlarmManager
,SyncManager
等),那么你可能会使用一个用于下载时间轴的服务。即使发布推文,你也可以跳过服务。但是设置新的Twitter帐户或任何可能涉及附件的操作(例如,将图片作为推文的一部分上传)应该使用服务。 - CommonsWare仅仅为了执行一个简单的网络请求就使用IntentServices,我认为有点过头了。如果您不想使用库或者更喜欢使用Retrofit、Volley等,请使用AsyncTask。(我建议您使用Retrofit) 在我的观点中,服务或者在这种情况下,是指IntentService是用来执行长时间后台任务的。
真正的问题是:您是否加载数据以填充前台活动或进行后台工作,即使没有可见的UI?
对于后台工作,Service是最好的选择。如果您依赖于Volley的线程管理,则甚至不需要IntentService。
对于前台工作,请考虑在Activity / Fragment中直接使用Loaders、Volley或Rxjava调用。
Service
(无论是IntentService
还是其他服务)都解决了与Retrofit解决的问题正交的特定问题,而Retrofit解决的问题与RxJava解决的问题也是不同的。 - CommonsWare