第一次听众发射需要花费很多时间(大约40秒),后续负载花费较少的时间(大约1秒),如何加快第一次加载?
我已经给了,
Sub foo()
Dim LastRow As Long
Dim rng As Range
Dim ws As Worksheet: Set ws = Sheets("Sheet3")
'declare and set your worksheet, amend as required
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'get the last row with data on Column A
Set rng = ws.Range("C2:C" & LastRow) 'amend this range to apply formula to.
rng.FormulaR1C1 = "=COUNTIF(C[-2],RC[-2])"
'rng.Value = rng.Value 'uncomment this line if you want to get the value in the cell and not the formualt
End Sub
开始活动。
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
答案 0 :(得分:3)
如果您正在使用听众,则需要知道您正在尝试通过互联网读取数据。您无法将此与尝试读取SQLite数据库进行比较,该数据库本地存储在磁盘上。从Firebase服务器获取数据的速度取决于您的Internet连接速度以及您尝试获取的数据量。所以很可能等待这么多的原因之一就是其中之一。如果原因是大量数据,请尝试优化您的查询或尝试将数据分成小部分。
如果我们说第一次尝试读取记录,它可能比后续的慢,因为它必须启动互联网连接。我知道Firebase团队正在努力提高性能,但在通过网络检索数据时,您不能指望0ms。
根据你的评论,我需要告诉你更多的事情。当您连接到服务器时,无法强制从缓存中检索数据,因为当您未连接到服务器时,无法停止从缓存中检索数据。
当设备永久脱机或您的应用程序暂时失去其网络连接而您无法更改此行为时,Firebase将被设置为从chache中检索数据。
修改强>
因此,要获取FirebaseDatabase
对象,您需要使用以下一行代码:
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
然后要获得DatabaseReference
,您需要使用以下行。
DatabaseReference rootRef = firebaseDatabase.getReference();
我确信你的活动需要多一个参考。假设您将使用两个:
DatabaseReference usersRef = rootRef.child("users");
DatabaseReference postRef = rootRef.child("post");
现在,您可以为这些引用中的每一个添加一个侦听器,如下所示:
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//code to get the data
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);
删除侦听器的代码正如我在 post 的回答中所解释的那样。
别忘了,onDestroy()
并不总是被召唤。
作为结论,您创建单个数据库连接,使用所需数量的引用,相应地添加侦听器,然后根据您活动的生命周期删除。