在我与同事开发的当前应用程序中,我们在内部使用带有 Volley 调用的 IntentServices 来处理 RESTful API 网络请求。它只是简单的 JSON 字符串数据和一些小图像。
我想问那些在处理网络请求方面有经验的人的问题是:是否有更合适或更清洁的东西可以在那里实现?
据我所知,使用 IntentService 的优势在于它在主线程的后台运行,通常是 Android 操作系统最后杀死的东西之一。缺点是 IntentServices 是按顺序运行的。
我已经阅读了很多关于 RxJava 和 Retrofit 的文章,并且觉得这种组合可以更好地满足我们的需求。改造本身可能就足够了,但我非常感谢第三方的一些见解。
最佳答案
我的一般经验法则是:
如果网络 I/O 应该在一秒以内,并且您不介意它没有运行完成,那么任何异步选项都应该没问题。
如果网络 I/O 应该超过一秒,或者您真的想增加它运行完成的几率,请使用 服务。您是使用 IntentService 还是其他一些 Service 实现取决于您,但您希望有一个 Service 作为操作系统的指示器正在工作,因此一旦您的应用程序移至后台,它就不会很快终止您的进程。请记住,“移至后台”并不总是由用户直接启动,因为来电等也会将您移至后台。
如果网络 I/O 将花费超过 15 秒,您不仅需要使用 Service,还需要考虑 WakeLock(通过我的 WakefulIntentService,或 WakefulBroadcastReceiver,或您自己精心管理的 WakeLock)和可能的 WifiLock。 15 秒是“设置”中的最短自动屏幕关闭时间,这也是该数字的来源。
考虑到所有这些:
The downside being that IntentServices are run sequentially.
我将其翻译为“IntentService 有一个用于处理请求的线程”。这是真实的。如果您需要 Service 并且需要并行处理,请创建您自己的 Service。当您没有未完成的工作时,请务必调用 stopSelf()。
I've been reading a lot about RxJava, and Retrofit, and feel like our needs could be better served with that combination
这与您是否使用服务无关。只是不要尝试从 IntentService 执行异步操作(例如,使用 Callback 的 Retrofit 调用),因为这样会破坏 IntentService 的目的>(向操作系统表明您正在工作)。因此,在 IntentService 中,您可以使用 Retrofit 的同步 API,无需 Callback。
关于android - 是否有任何开发模式可以替代网络请求的 IntentService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31346851/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende