首页 文章

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

提问于
浏览
9

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

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

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

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

3 回答

  • 0

    使用IntentServices只是为了执行一个简单的网络请求,IMO就是很多 . 你应该使用AsyncTask,如果你不想使用库,或者如果你更喜欢Retrofit,Volley ...(我建议使用Retrofit) . IMO,服务,或者在这种情况下,IntentService旨在执行长时间的后台任务 .

  • 0

    真正的问题是:您是否加载数据以填充前台中的活动或进行后台工作,即使没有可见的UI?

    对于后台工作,服务是最佳选择 . 如果您依赖于Volley的线程管理,您甚至不需要IntentService .

    对于前台工作,请考虑直接在Activity / Fragment中使用Loaders或Volley或Rxjava调用 .

  • 22

    我的一般经验法则是:

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

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

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

    考虑到这一切:

    缺点是IntentServices按顺序运行 .

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

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

    这与您是否使用 Service 无关 . 只是不要尝试从 IntentService 执行异步操作(例如,使用 Callback 进行Retrofit调用),因为你破坏了 IntentService 的目的(向操作系统表明你正在做的工作) . 因此,从 IntentService 开始,您将使用Retrofit的同步API,而不是 Callback .

相关问题