使用Firebase的Android应用在大多数旧设备上运行缓慢

时间:2019-03-11 18:22:38

标签: android performance firebase firebase-realtime-database

我的客户已经在使用2个应用程序。这些应用程序将Firebase用作数据库。

由于这两个客户及其工作人员开始输入数据,所以我已经变得非常缓慢,尤其是在旧的android设备上。

我将这种结构用于一项简单的任务,可能对这里的示例很有帮助:

在USERS下,我拥有所有用户的ID,在每个ID下,我都有:

{
  "checkin" : {
    "Data: 1-11-2018 Horario checkin: 19:02" : {
      "ano" : "2018",
      "checkIn" : true,
      "checkoutCorrect" : true,
      "dia" : "1",
      "hora" : "19",
      "latitude" : "-22.42003992",
      "longitude" : "-45.4668167",
      "mes" : "11",
      "minuto" : "02",
      "nomePaciente" : "NAME 2"
    },
    (...)
  },
  "checkout" : {    
    (...)
  },
  "pacientes" : {
    "NAME" : "Mon Oct 01 20:16:36 GMT-11:00 2018"
  },
  "user type" : "FUNCIONARIO",
  "usuario" : {
    "alreadyAtribuidoAoPaciente" : false,
    "datanascimento" : "03/05/1970",
    "deviceModel" : "motorola XT1097",
    "funcao" : "TECNICO DE ENFERMAGEM",
    "lastLogin" : "7-3-2019 18:52",
    "nome" : "NAME",
    "nroconselho" : "530918",
    "telefone" : "35999428676",
    "tipousuario" : "FUNCIONARIO",
    "userID" : "8H1tHvz3BcR3XeCjz6BWXvC9fFM2",    
    "version" : "2.00"
  }
}

重要提示:“签到”和“签出”中包含很多信息。

现在,我要检查用户列表,然后点击按钮:

ConfiguracaoFirebase.getFirebaseReferenceUsuarios().keepSynced(true); //this is the Firebase reference to USERS explained above
startActivity(intentThatHasAList);

新活动开始后,我通过以下方式加载数据:

valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (final DataSnapshot snap: dataSnapshot.getChildren()){
                    if (snap.child("user type").getValue().equals("ADMIN")){
                        final Usuario recordUser = new Usuario();
                        recordUser.setName(snap.child("usuario").child("nome").getValue().toString());
                        //...
                        recordUser.setId(snap.getKey());

                        listUsuarios.add(recordUser);
                    }
                    reorderArray();

                }

            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        };

        ConfiguracaoFirebase.getFirebaseReferenceUsuarios()
                .addValueEventListener(valueEventListener);

似乎就像一个简单的代码,想要检索信息正确吗? 但是,此简单任务在内存不足的设备上很慢,因此我猜测数据库已经有大量数据,这可能不仅是从那些引用中检索数据。

首先,我认为这是“保持同步”的代码行(因为它将同步所有代码,并且有很多用户,其中每个用户都包含许多CHECKIN和CHECKOUT)是问题所在,但是在删除它之后,该应用仍然很慢。

如果有人在Fi​​rebase方面有很好的经验,这对于大多数人来说可能是一个有用的示例和常见问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

在我发布了这个问题之后,我有了一个见识。

这样做:

 ConfiguracaoFirebase.getFirebaseReferenceUsuarios()
                .addValueEventListener(valueEventListener);

我得到了其中的所有信息,包括每个用户,每个CHECKIN和CHECKOUT ...所以我必须使用一条信息较少的其他路径。那就是所有的缓慢。

解决方案:将所有BASIC数据移动到不存在CHECKIN和CHECKOUT(具有大量数据信息)的新路径。