是否有任何开发模式可以替换网络请求的IntentService?

Rya*_*mon 9 android android-networking rx-java retrofit android-intentservice

在我与同事一起开发的当前应用程序中,我们使用IntentServices和Volley调用来处理RESTful API网络请求.它只是简单的JSON字符串数据和一些小图像.

我对那些在处理网络请求方面经验丰富的问题​​是这样的:那里有更合适或更清洁的东西吗?

根据我的理解,使用IntentService的优势在于它在主线程的后台运行,并且通常是Android OS杀死的最后一件事.缺点是IntentServices按顺序运行.

我一直在阅读很多关于RxJava和Retrofit的内容,并且觉得我们的需求可以通过这种组合得到更好的服务.改造本身就足够了,但我真的很感激第三方洞察力.

Com*_*are 22

我的一般经验法则是:

  • 如果网络I/O应该在一秒钟之内,并且您不介意它是否没有运行完成,那么任何异步选项都应该没问题.

  • 如果网络I/O应该超过一秒,或者你真的想增加运行完成的几率,请使用a Service.无论您使用IntentService还是其他一些Service实现都取决于您,但您希望将Service一个指示器作为您正在运行的操作系统的指示器,因此一旦您的应用程序移至后台,它就不会非常快速地终止您的过程.请记住,"移动到后台"并非始终由用户直接启动,因为来电也会将您移至后台.

  • 如果网络I/O需要超过15秒,您不仅需要使用a Service,而且还需要考虑WakeLock(通过我的WakefulIntentService,或者WakefulBroadcastReceiver,或者您自己的精心管理WakeLock)以及可能的a WifiLock.15秒是"设置"中的最小自动屏幕关闭时间段,这是该数字的来源.

考虑到这一切:

缺点是IntentServices按顺序运行.

我将其翻译为"一个IntentService用于处理请求的单个线程".这是真的.如果您需要Service并且需要并行处理,请创建自己的Service.stopSelf()当你没有出色的工作时,一定要打电话.

我一直在阅读很多关于RxJava和Retrofit的信息,感觉我们的需求可以通过这种组合得到更好的服务

这与您是否使用a无关Service.只是不要尝试从a中执行异步操作(例如,使用a的Retrofit调用Callback)IntentService,因为你破坏了IntentService(向操作系统表明你正在做的工作)的目的.所以,从一个IntentService,你会使用Retrofit的同步API,没有Callback.