应用启动时的Firebase需要超过3秒才能加载数据

时间:2017-01-30 15:37:00

标签: android firebase firebase-realtime-database

我在firebase中有我的只读数据,大概是50KB。 我需要关于应用启动的完整数据。为此,我在 onCreate 方法

中编写了以下代码
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();
Log.i("FIREBASE", "Before Firebase Call");
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.i("FIREBASE", "Call Completed");
        // do my work i.e build my UI
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(context, "Please Check your Internet connection", Toast.LENGTH_LONG);
    }
});

现在我的问题是,Firebase获取数据的时间超过4秒。在上面的代码中,两个日志语句之间存在4秒的差距,即“Firebase Call之前”和'呼叫已完成'

我甚至在真实设备中测试过,即使它至少需要3秒钟。 我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:2)

正如道格史蒂文森所说:当您第一次加载数据时,或者如果您所处的世界与Firebase服务的托管位置不同,应该会有一点延迟。< / p>

我建议你在显示主要活动之前创建一个加载屏幕(启动画面)来加载所有数据。 在此加载活动中,您可以使用keepSynced方法加载所有数据:

FirebaseDatabase.getInstance().getReference().keepSynced(true);

此方法会将整个数据库下载到磁盘缓存中。当您显示主要活动时,FIrebase将从此缓存加载数据。

通常,加载屏幕在屏幕上停留1000-1500毫秒。但是,由于您说数据需要3秒钟,我建议创建一个播放3000毫秒动画的加载屏幕(或一组结合最后3000毫秒的动画)。如果您不知道如何制作动画,可以观看Chet Haase's DevBytes video

答案 1 :(得分:1)

首次建立连接时会产生一些开销。连接通过安全的websocket,并且为了确保它是安全的,客户端和所需的服务器之间有多次往返。如果您的连接速度很慢,特别是在世界上与Firebase服务碰巧托管的地方不同的地方,很可能会看到这样的延迟。

您可以通过在应用程序启动后立即尝试从数据库读取而不是等待第一次需要数据来缓解一些延迟。这将尽快启动websocket连接,因此第一个真实数据请求的感知延迟似乎并不那么极端。

在我的应用中,我使用加载屏幕(启动画面)确保在应用尝试显示任何数据之前加载了所有必需的数据。这也有助于减少感知的加载时间。