我正在使用改造 2 进行 API 调用,但我的问题是 API 响应需要时间来显示响应,我是否有机会存储数据并加载缓存并显示它,然后同时调用网络应用程序接口(interface)。
例如:
第一次点击 -> 进行网络调用 - 将输出呈现到屏幕,比如 ListView -> 将响应存储在缓存中
下次用户出现在屏幕上时 --> 加载缓存并将其呈现到屏幕上 --> 进行网络调用 --> 使用更改刷新适配器
我指的是要点链接之一 https://gist.github.com/Tetr4/d10c5df0ad9218f967e0
最佳答案
是的,有很多解决方案。
如果您使用 RxJava(与 retrofit 配合良好),这就是解决方案
首先是像这样使用 concat:
Observable<Data> source = Observable
.concat(memory, disk, network).first();
内存、磁盘和网络都是 Observables。这将是第一个。这意味着如果缓存可用,则使用缓存,否则使用磁盘,否则使用网络。
问题在于,一旦有了缓存,它就永远不会访问网络。这就是为什么你应该这样做:
getRemoteItems().publish { Flowable.merge(it, getLocalItems().takeUntil(it)) }
这将同时获取远程数据和本地数据,但是一旦获取了远程数据就停止本地数据。您可以使用 doOnSuccess 使用远程数据填充本地数据库
是的,有很多解决方案。
首先是像这样使用 concat:
Observable<Data> source = Observable
.concat(memory, disk, network).first();
内存、磁盘和网络都是 Observables。这将是第一个。这意味着如果缓存可用,则使用缓存,否则使用磁盘,否则使用网络。
问题在于,一旦有了缓存,它就永远不会进入网络。这就是为什么你应该这样做:
getRemoteItems()
.doOnSuccess { storeToLocal(it) }
.publish { Flowable.merge(it, getLocalItems().takeUntil(it)) }
这意味着它在尝试获取缓存的同时获取远程项目。如果它能够获取远程数据,它会将数据存储到缓存中。
如果您使用的是第一个示例而不使用 first(),那么在最坏的情况下它会传送 3 倍的数据,但要等到之前的可观察对象完成。这意味着它将尝试内存,一旦内存调用 onComplete() 它就会进入磁盘。如果磁盘已完成,则尝试网络。
Observable<Data> source = Observable
.concat(memory, disk, network)
关于android - 在网络调用之前改造 2 加载缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863176/
鉴于我有以下迁移: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
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www