当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库应用程序在返回联机后冻结,以便在脱机时执行许多操作

越俊驰
2023-03-14

我的应用程序使用firebase实时数据库,我设置PersistenceEnabled(true)使其在设备脱机时仍能工作。设备脱机时一切正常,添加、更改和删除数据等操作都可以正常工作。

当设备在做了太多操作后回到在线时,问题就来了,例如离线时删除了很多数据。当我看到我的实时数据库中的许多数据被同时删除后,我不能进行几次(5-10分钟)添加和更改数据等操作,这取决于离线时我删除了多少数据。我只能看到我的添加和更改操作之后的时间。

我的问题是多少操作Firebase可以处理离线时,并使其仍然顺利,当它回到在线,所以我的应用程序不喜欢冻结了几次,当用户添加和更改另一个数据?,或者

当我在脱机模式下有很多操作要做时,从脱机模式过渡到联机模式时,有什么技巧可以使其顺利进行吗?

以下是我在删除数据之前更新数据的代码,脱机时,我的应用程序可以运行此代码块直到100次,例如在1小时内:

public void ritase(String number){                                       
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/vehicles/").child(number);

    HashMap<String, Object> childUpdates = new HashMap<String, Object>();
    childUpdates.put("ritase/from", from);
    childUpdates.put("ritase/to", to);
    childUpdates.put("ritase/accept", accept);
    childUpdates.put("ritase/userid", userid);
    childUpdates.put("ritase/passenger", passenger);
    childUpdates.put("ritase/stat", 1);
    childUpdates.put("ritase/time_out", time);
    childUpdates.put("trips/content/time_out", time);
    childUpdates.put("trips/content/stat", 1);

    ref.updateChildren(childUpdates);
    ref.removeValue();                                                      
}

在我的应用程序重新上线后,下面的代码块操作被卡住了几分钟。卡在此处意味着我无法立即在我的应用程序中看到更改:

Public void updateStatus(String number){                                   
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference("/vehicles/").child(number); 
    HashMap<String, Object> childUpdates = new HashMap<String, Object>();
    childUpdates.put("driver/name", name);
    childUpdates.put("driver/nip", nip);

    if (PrefHelper.getPref(context,VarConstant.ISBARCODE) == "true") {
        childUpdates.put("is_barcode", 1);
    } else {
        childUpdates.put("is_barcode", 0);
    }

    childUpdates.put("position/content/location", location);
    childUpdates.put("position/content/time_in", time);
    childUpdates.put("position/content/time_out", 0);
    childUpdates.put("position/content/stat", 0);
    childUpdates.put("position/content/username", username);

    int status;

    if (PrefHelper.getPref(context, VarConstant.TYPE).contains(VarConstant.PERIMETER)) {
        status = 0;
        childUpdates.put("trips/content/status", status);
        childUpdates.put("trips/content/time_start", 0);
        childUpdates.put("trips/content/time_stop", 0);
    } else {
        status = 2;
        childUpdates.put("trips/content/status", status);
        childUpdates.put("trips/content/time_start", time);
        childUpdates.put("trips/content/time_stop", time);
    }

    ref.updateChildren(childUpdates);                                       

}

我还尝试使用removeValue()的completion listener,但即使在firebase实时数据库中数据被删除,它也会很晚启动。

共有1个答案

南门飞扬
2023-03-14

使用磁盘持久性时,Firebase在磁盘上存储两种类型的数据:

  1. 最近读取数据的缓存。
  2. 等待写入的队列。

它还保留所有活动数据的内存副本,这意味着:您当前正在侦听的任何数据。在此内存中的副本中,挂起的写入将应用于数据。

当您重新启动应用程序并连接侦听器时,Firebase将加载缓存数据并应用其所有挂起的写入。此过程具有线性性能,并且由于使用了哈希算法,因此速度可能非常慢。

这意味着重新启动一个包含大量缓存数据和许多挂起写入的应用程序确实需要一些时间。这是预期的行为。

要缩短启动时间,请限制保持脱机状态的数据量,并限制挂起的写入次数。

 类似资料:
  • 我做了一个应用程序在Android Studio计算财务和使用Firebase实时数据库存储输入的数据。当用户失去互联网连接时,他们离线时输入的数据应该存储在设备的本地缓存中,然后在用户重新联机时推送到Firebase数据库。我该怎么做呢?

  • 我的应用程序有一个目录,它使用Firebase来存储和更新数据。我想显示已经缓存的数据,如果应用程序被杀死,并再次启动,而不在线。 firebase是否在应用程序被终止时删除缓存? 无论用户在线或离线,我们都可以首先推送离线数据。

  • 在firebases文档中,它说: 即使启用了持久性,事务也不会在应用程序重新启动时持久化。因此,您不能依赖脱机完成的事务提交到Firebase实时数据库。为了提供最佳的用户体验,您的应用程序应该显示尚未将事务保存到Firebase实时数据库中,或者确保您的应用程序手动记住事务,并在应用程序重新启动后再次执行。https://firebase.google.com/docs/database/io

  • 我尝试使用Quarkus制作一个原生应用程序,但当我构建它时,它冻结了: > 我在Manjaro linux下,用github存储库安装了graalvm。

  • 问题内容: 通过阅读本文,我知道每个Java应用程序都将在特定的Java虚拟机实例中运行。因此,如果我执行以下命令(“ Java -jar test1.jar”,“ Java -jar test2.jar”),我将在系统中获得两个进程。并且,如果每个命令都使用默认堆大小,例如256M。总内存成本为512M,对吗?还有其他问题: Java虚拟机是一个守护进程,由系统启动吗? 当我执行“ java -

  • 我正在使用火库实时数据库函数 .orderByChild() 和 .equalTo() 来获取要更新的数据节点。但是,我似乎无法从查询中获得任何结果。 我的数据库结构 我的代码 代码日志 senderSnapshot null senderSnapshot金额0 我已经手动检查了有几个节点,其中“sid”设置为我正在寻找的“userId”。 为什么我的查询没有得到任何结果? 看起来我必须搜索dbR