【问题标题】:Firebase listeners first time invocation takes timeFirebase 侦听器第一次调用需要时间
【发布时间】:2018-02-19 09:49:47
【问题描述】:

第一次监听器触发需要这么多时间(大约 40 秒),后续加载需要更少的时间(大约 1 秒),如何加快第一次加载?

我已经给了,

    FirebaseDatabase.getInstance().setPersistenceEnabled(true);

活动开始时。

        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("");
        ref.keepSynced(true);
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    如果您使用的是侦听器,则需要知道您正在尝试通过 Internet 读取数据。您无法将此与尝试读取存储在本地磁盘上的 SQLite 数据库进行比较。从 Firebase 服务器获取数据的速度取决于您的互联网连接速度和您尝试获取的数据量。所以很可能等待这么久的原因就是其中之一。如果原因是数据量太大,请尝试优化您的查询或尝试获取小部分数据。

    如果我们说的是第一次尝试读取记录,它可能会比后续尝试慢,因为它必须启动互联网连接。我知道 Firebase 团队正在努力提高性能,但通过网络检索数据时不能指望 0 毫秒。

    根据您的评论,我还需要告诉您一些事情。当您连接到服务器时,无法强制从缓存中检索数据,因为您无法在未连接到服务器时停止从缓存中检索数据。

    Firebase 旨在在设备永久离线或您的应用程序暂时失去其网络连接且您无法更改此行为时从缓存中检索数据。

    编辑:

    所以要获得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() 并不总是被调用。

    作为结论,您创建一个单一的数据库连接,使用尽可能多的引用,相应地添加侦听器,然后根据您的活动的生命周期删除。

    【讨论】:

    • setPersistenceEnabled(true) 应放在活动的第一行,但请记住,如果您仍连接到服务器,则无法从缓存中获取数据。
    • 不,没有!
    • 因为不需要创建新的网络连接,第一次已经创建好了。
    • 用户设备和 Firebase 服务器之间。
    • 所有人都一样。
    猜你喜欢
    • 2021-12-29
    • 2019-04-15
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多