我在我的应用程序中使用 Firebase 的实时数据库功能。数据库看起来像这样:
节点 104、1040... 有更多的元素/数据。我正在获取此数据,按值在每个 Integer 父级中可用的节点“updatedAt”处排序,如快照所示。我正在使用 onChildAddedListener() 来获取最后 20 个元素。 “结果”中大约有 1050 个节点。
问题:
即使在高速 WiFi 上,获取数据也需要很长时间,大约需要 30 秒。
Firebase 是否允许任何回调来通知已获取数据?我想将每个自定义对象附加到从 Firebase 收到的 ArrayList 并将其通过 Intent 传递给另一个 Activity 。我正在计算收到的对象,当它变成 20 时,我打开我的 Activity 。这是唯一的方法吗?如果有更好的出路,请提出建议。
这是我的代码:
public class Splash extends AppCompatActivity{
private static final String TAG = "Splash Activity";
private ArrayList<News> NewsArrayList = new ArrayList<>();
private DatabaseReference newsReference;
private int position = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
newsReference = FirebaseDatabase.getInstance().getReference().child("results");
Query queryNewsReference = newsReference.orderByChild("updatedAt").limitToLast(20);
fetchNews(queryNewsReference);
}
private void fetchNews(Query queryNewsReference) {
queryNewsReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
News newsObject = dataSnapshot.getValue(News.class);
Log.d(TAG,"News Title: "+ newsObject.getVideo_title());
NewsArrayList.add(newsObject);
position++;
if(position == 20){
startMainActivity();
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s){
Log.d(TAG, "onChildChanged() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.d(TAG, "onChildRemoved() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildMoved() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG,"Database Error: "+databaseError.toString());
}
});
}
private void startMainActivity() {
Intent intent = new Intent(Splash.this,MainActivity.class);
intent.putExtra("NewsList",NewsArrayList);
Splash.this.startActivity(intent);
}
最佳答案
在添加值监听器之前尝试重新连接到 firebase:
private void fetchNews(Query queryNewsReference)
{
if (FirebaseDatabase.getInstance() != null)
{
FirebaseDatabase.getInstance().goOffline();
}
FirebaseDatabase.getInstance().goOnline();
queryNewsReference.addChildEventListener(new ChildEventListener() {
...
}
关于java - Android:Firebase 需要太多时间来获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37702842/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我主要使用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
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c