Firebase 行为异常

Firebase behaves strangely

该视频介绍了输入以下代码后 Firebase 发生的情况。直到视频的第二个5,一切正常。 当我从第 6 秒开始点击一个按钮时,Firebase 遇到了这个视频问题:

https://www.youtube.com/watch?v=rQlTZyCWcmM

代码:

        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String raça = spinner_raca.getSelectedItem().toString();
                final String regiaoDoEstado = spinner_regiaoDoEstado.getSelectedItem().toString();
                final String estado = spinner_estado.getSelectedItem().toString();
                String identificador2 = identificadorCampo2.getText().toString();
                String identificadorEmHash = criptografarEmMD5(identificador2);

                Intent intentRecebedora = getIntent();
                Bundle bundleRecebedor = intentRecebedora.getExtras();
                String nomecompleto = bundleRecebedor.getString("nomecompleto");
                String email = bundleRecebedor.getString("email");
                String doencasPreExistentes = bundleRecebedor.getString("doencasPreExistentes");
                String dataDeNascimento = bundleRecebedor.getString("dataDeNascimento");
                String genero = bundleRecebedor.getString("genero");
                String identificadorEmHash = bundleRecebedor.getString("identificadorEmHash");
                String telefone = intentRecebedora.getStringExtra("telefone");

                referencia = FirebaseDatabase.getInstance().getReference().child("Usuarios").child(identificadorEmHash);
                Toast.makeText(getApplicationContext(), identificadorEmHash, Toast.LENGTH_LONG).show();
                if(identificadorEmHash.equals(null)) {
                    Toast.makeText(getApplicationContext(), "Identifier does not exist", Toast.LENGTH_LONG).show();
                } else {
                    referencia.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {

                        }
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            referencia = FirebaseDatabase.getInstance().getReference().child("Usuarios").child(identificadorEmHash);
                            if (!dataSnapshot.exists()) {
                                Toast.makeText(getApplicationContext(), "O identificador digitado não existe.", Toast.LENGTH_LONG).show();
                            } else {
                                HashMap<String, String> sendToDataBase = new HashMap<>();
                                    sendToDataBase.put("Nome Completo", nomecompleto);
                                    sendToDataBase.put("E-mail", email);
                                    sendToDataBase.put("Identificador em Hash", identificadorEmHash);
                                    sendToDataBase.put("Telefone", telefone);
                                    sendToDataBase.put("Doenças Pré Existentes", doencasPreExistentes);
                                    sendToDataBase.put("Data de Nascimento", dataDeNascimento);
                                    sendToDataBase.put("Gênero", genero);
                                    sendToDataBase.put("Região do Estado em que mora", regiaoDoEstado);
                                    sendToDataBase.put("Raça", raça);
                                    sendToDataBase.put("Estado do Brasil em que mora", estado);

                                try {
                                    raiz.child(identificadorEmHash).setValue(sendToDataBase);

                                } catch (Exception e) {
                                    e.getMessage();
                                }

                            }
                           
                        }
                    });
                }
            }
        });

请问如何解决这个问题? Firebase 中是否有我们可以看到错误的位置? Android Studio 中没有指出任何错误,phone 系统崩溃,必须重新启动。

当您使用 Query#addValueEventListener() 方法时,这意味着您正在侦听 real-time 更新(更改)。也就是说,实时数据库中发生的与您的 referencia 查询相对应的每个更改都将始终触发 onDataChange() 方法。因为当您将回调中的数据添加到您正在收听的查询时,您的 sendToDataBase 会再次写入,因此会出现这种行为。这种情况一次又一次地发生。

要解决这个问题,只需将上面的方法调用更改为Query#addListenerForSingleValueEvent()。这意味着它将监听变化一次。